home *** CD-ROM | disk | FTP | other *** search
/ Network PC / Network PC.iso / amiga utilities / communication / bbs / termv4.6 / extras / source / term-source.lha / ARexxCommands.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-18  |  99.0 KB  |  5,902 lines

  1. /*
  2. **    ARexxCommands.c
  3. **
  4. **    ARexx interface command support routines
  5. **
  6. **    Copyright © 1990-1996 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #ifndef _GLOBAL_H
  11. #include "Global.h"
  12. #endif
  13.  
  14.     /* Number of bytes already processed by ScanNodeFilter(). */
  15.  
  16. STATIC LONG WaitCount = 0;
  17.  
  18.     /* Cheapo shortcuts ;-) */
  19.  
  20. #define Args    Pkt -> Array
  21. #define Results    Pkt -> Results
  22.  
  23.     /* ScanNodeFilter():
  24.      *
  25.      *    Scan memory for a certain sequence.
  26.      */
  27.  
  28. STATIC STRPTR
  29. ScanNodeFilter(register STRPTR Data,register LONG Size,register struct WaitNode *Node,LONG *Position)
  30. {
  31.     register UBYTE c;
  32.     register LONG Mask;
  33.  
  34.     *Position = 0;
  35.  
  36.     if(Config -> SerialConfig -> StripBit8)
  37.         Mask = 0x7F;
  38.     else
  39.         Mask = 0xFF;
  40.  
  41.     if(Node)
  42.     {
  43.         do
  44.         {
  45.             (*Position)++;
  46.  
  47.             if(c = ToUpper((*Data++) & Mask))
  48.             {
  49.                 register BOOL MatchMade;
  50.  
  51.                 do
  52.                 {
  53.                     MatchMade = FALSE;
  54.  
  55.                     if(Node -> Count == WaitCount)
  56.                     {
  57.                         if(c == (Node -> Node . ln_Name[WaitCount] & Mask))
  58.                         {
  59.                             MatchMade = TRUE;
  60.  
  61.                             if(!Node -> Node . ln_Name[++Node -> Count])
  62.                             {
  63.                                 if(Node -> ResponseLen)
  64.                                 {
  65.                                     SerWriteVerbatim(Node -> Response,Node -> ResponseLen,FALSE);
  66.  
  67.                                     Node -> Count = 0;
  68.                                 }
  69.                                 else
  70.                                     return(Node -> Node . ln_Name);
  71.                             }
  72.                         }
  73.                     }
  74.  
  75.                     if(MatchMade)
  76.                         WaitCount++;
  77.                     else
  78.                     {
  79.                         if(WaitCount)
  80.                         {
  81.                             WaitCount = 0;
  82.  
  83.                             Node -> Count = 0;
  84.                         }
  85.                         else
  86.                             break;
  87.                     }
  88.                 }
  89.                 while(!WaitCount);
  90.             }
  91.         }
  92.         while(--Size);
  93.     }
  94.     else
  95.     {
  96.         do
  97.         {
  98.             (*Position)++;
  99.  
  100.             if(c = ToUpper((*Data++) & Mask))
  101.             {
  102.                 register BOOL MatchMade;
  103.  
  104.                 do
  105.                 {
  106.                     MatchMade = FALSE;
  107.  
  108.                     Node = (struct WaitNode *)GenericListTable[GLIST_WAIT] -> ListHeader . mlh_Head;
  109.  
  110.                     while(Node -> Node . ln_Succ)
  111.                     {
  112.                         if(Node -> Count == WaitCount)
  113.                         {
  114.                             if(c == (Node -> Node . ln_Name[WaitCount] & Mask))
  115.                             {
  116.                                 Node -> Count++;
  117.  
  118.                                 MatchMade = TRUE;
  119.  
  120.                                 if(!Node -> Node . ln_Name[Node -> Count])
  121.                                 {
  122.                                     if(Node -> ResponseLen)
  123.                                     {
  124.                                         SerWriteVerbatim(Node -> Response,Node -> ResponseLen,FALSE);
  125.  
  126.                                         Node -> Count = 0;
  127.                                     }
  128.                                     else
  129.                                         return(Node -> Node . ln_Name);
  130.                                 }
  131.                             }
  132.                         }
  133.  
  134.                         Node = (struct WaitNode *)Node -> Node . ln_Succ;
  135.                     }
  136.  
  137.                     if(MatchMade)
  138.                         WaitCount++;
  139.                     else
  140.                     {
  141.                         if(WaitCount)
  142.                         {
  143.                             WaitCount = 0;
  144.  
  145.                             Node = (struct WaitNode *)GenericListTable[GLIST_WAIT] -> ListHeader . mlh_Head;
  146.  
  147.                             while(Node -> Node . ln_Succ)
  148.                             {
  149.                                 Node -> Count = 0;
  150.  
  151.                                 Node = (struct WaitNode *)Node -> Node . ln_Succ;
  152.                             }
  153.                         }
  154.                         else
  155.                             break;
  156.                     }
  157.                 }
  158.                 while(!WaitCount);
  159.             }
  160.         }
  161.         while(--Size);
  162.     }
  163.  
  164.     return(NULL);
  165. }
  166.  
  167. STRPTR
  168. RexxActivate(struct RexxPkt *Pkt)
  169. {
  170.     if(Window)
  171.         BumpWindow(Window);
  172.     else
  173.         Signal(ThisProcess,SIGBREAKF_CTRL_F);
  174.  
  175.     return(NULL);
  176. }
  177.  
  178. STRPTR
  179. RexxAdd(struct RexxPkt *Pkt)
  180. {
  181.     enum    {    ARG_ADD_FROM,ARG_ADD_BEFORE,ARG_ADD_AFTER,ARG_ADD_RESPONSE,
  182.             ARG_ADD_COMMAND,ARG_ADD_PHONEENTRY,ARG_ADD_NAME };
  183.  
  184.     LONG ListIndex;
  185.  
  186.     if((ListIndex = ToList(Args[ARG_ADD_FROM])) != -1)
  187.     {
  188.         struct GenericList    *List = GenericListTable[ListIndex];
  189.         LONG             AddMode;
  190.  
  191.         if(Args[ARG_ADD_BEFORE])
  192.             AddMode = ADD_GLIST_BEFORE;
  193.         else
  194.         {
  195.             if(Args[ARG_ADD_AFTER])
  196.                 AddMode = ADD_GLIST_BEHIND;
  197.             else
  198.                 AddMode = ADD_GLIST_BOTTOM;
  199.         }
  200.  
  201.         if(ListIndex == GLIST_DIAL)
  202.         {
  203.             if(Args[ARG_ADD_PHONEENTRY])
  204.             {
  205.                 if(!IsNumeric(Args[ARG_ADD_PHONEENTRY]))
  206.                 {
  207.                     STRPTR Buffer;
  208.  
  209.                     if(Buffer = CreateMatchBuffer(Args[ARG_ADD_PHONEENTRY]))
  210.                     {
  211.                         struct DialNode    *Node;
  212.                         LONG         i;
  213.                         BOOL         GotIt = FALSE;
  214.  
  215.                         for(i = 0 ; i < NumPhoneEntries ; i++)
  216.                         {
  217.                             if(MatchBuffer(Buffer,Phonebook[i] -> Header -> Name))
  218.                             {
  219.                                 if(Node = (struct DialNode *)CreateGenericListNode(sizeof(struct DialNode),""))
  220.                                 {
  221.                                     Node -> Entry = Phonebook[i];
  222.  
  223.                                     AddGenericListNode(List,(struct Node *)Node,AddMode);
  224.  
  225.                                     GotIt = TRUE;
  226.                                 }
  227.                                 else
  228.                                 {
  229.                                     Results[0] = RC_ERROR;
  230.                                     Results[1] = ERROR_NO_FREE_STORE;
  231.  
  232.                                     break;
  233.                                 }
  234.                             }
  235.                         }
  236.  
  237.                         if(!GotIt && Results[0] != RC_ERROR)
  238.                         {
  239.                             Results[0] = RC_ERROR;
  240.                             Results[1] = ERROR_OBJECT_NOT_FOUND;
  241.                         }
  242.  
  243.                         DeleteMatchBuffer(Buffer);
  244.                     }
  245.                     else
  246.                     {
  247.                         Results[0] = RC_ERROR;
  248.                         Results[1] = ERROR_NO_FREE_STORE;
  249.                     }
  250.                 }
  251.                 else
  252.                 {
  253.                     LONG Index = Atol(Args[ARG_ADD_PHONEENTRY]);
  254.  
  255.                     if(Index < 0 || Index > NumPhoneEntries)
  256.                     {
  257.                         Results[0] = RC_ERROR;
  258.                         Results[1] = TERMERROR_INDEX_OUT_OF_RANGE;
  259.                     }
  260.                     else
  261.                     {
  262.                         struct DialNode    *Node;
  263.  
  264.                         if(Node = (struct DialNode *)CreateGenericListNode(sizeof(struct DialNode),""))
  265.                         {
  266.                             Node -> Entry = Phonebook[Index];
  267.  
  268.                             AddGenericListNode(List,(struct Node *)Node,AddMode);
  269.                         }
  270.                         else
  271.                         {
  272.                             Results[0] = RC_ERROR;
  273.                             Results[1] = ERROR_NO_FREE_STORE;
  274.                         }
  275.                     }
  276.                 }
  277.             }
  278.             else
  279.             {
  280.                 if(Args[ARG_ADD_NAME])
  281.                 {
  282.                     struct Node *Node;
  283.  
  284.                     if(Node = CreateGenericListNode(sizeof(struct DialNode),Args[ARG_ADD_NAME]))
  285.                         AddGenericListNode(List,Node,AddMode);
  286.                     else
  287.                     {
  288.                         Results[0] = RC_ERROR;
  289.                         Results[1] = ERROR_NO_FREE_STORE;
  290.                     }
  291.                 }
  292.             }
  293.         }
  294.         else
  295.         {
  296.             if(ListIndex == GLIST_WAIT)
  297.             {
  298.                 STRPTR    Response;
  299.                 LONG    ResponseLen;
  300.  
  301.                 if(Args[ARG_ADD_RESPONSE])
  302.                 {
  303.                     Response    = Args[ARG_ADD_RESPONSE];
  304.                     ResponseLen    = strlen(Response);
  305.                 }
  306.                 else
  307.                 {
  308.                     Response    = NULL;
  309.                     ResponseLen    = 0;
  310.                 }
  311.  
  312.                 if(Args[ARG_ADD_NAME])
  313.                 {
  314.                     struct WaitNode *Node;
  315.  
  316.                     if(Node = (struct WaitNode *)CreateGenericListNode(sizeof(struct WaitNode) + ResponseLen + 1,Args[ARG_ADD_NAME]))
  317.                     {
  318.                         LONG i,Len;
  319.  
  320.                         Len = TranslateString(Node -> Node . ln_Name,Node -> Node . ln_Name);
  321.  
  322.                         Node -> Node . ln_Name[Len] = 0;
  323.  
  324.                         for(i = 0 ; i < Len ; i++)
  325.                             Node -> Node . ln_Name[i] = ToUpper(Node -> Node . ln_Name[i]);
  326.  
  327.                         if(Response && ResponseLen)
  328.                         {
  329.                             Node -> Response = &Node -> Node . ln_Name[Len + 1];
  330.  
  331.                             strcpy(Node -> Response,Response);
  332.  
  333.                             Node -> ResponseLen = TranslateString(Node -> Response,Node -> Response);
  334.                         }
  335.                         else
  336.                             Node -> ResponseLen = 0;
  337.  
  338.                         AddGenericListNode(List,Node,AddMode);
  339.                     }
  340.                     else
  341.                     {
  342.                         Results[0] = RC_ERROR;
  343.                         Results[1] = ERROR_NO_FREE_STORE;
  344.                     }
  345.                 }
  346.                 else
  347.                 {
  348.                     Results[0] = RC_ERROR;
  349.                     Results[1] = ERROR_REQUIRED_ARG_MISSING;
  350.                 }
  351.             }
  352.             else
  353.             {
  354.                 if(ListIndex == GLIST_TRAP)
  355.                 {
  356.                     if(!Args[ARG_ADD_NAME] || !Args[ARG_ADD_COMMAND])
  357.                     {
  358.                         struct TrapNode    *Node;
  359.                         UBYTE         LocalBuffer[MAX_FILENAME_LENGTH];
  360.                         LONG         NameLen;
  361.  
  362.                         if(strlen(Args[ARG_ADD_NAME]) > 255)
  363.                             Args[ARG_ADD_NAME][255] = 0;
  364.  
  365.                         NameLen = TranslateString(Args[ARG_ADD_NAME],LocalBuffer);
  366.  
  367.                         if(Node = (struct TrapNode *)AllocVecPooled(sizeof(struct TrapNode) + strlen(Args[ARG_ADD_NAME]) + 1 + NameLen + strlen(Args[ARG_ADD_COMMAND]) + 1,MEMF_ANY))
  368.                         {
  369.                             STRPTR String = Node -> Node . ln_Name = (STRPTR)(Node + 1);
  370.  
  371.                             strcpy(String,Args[ARG_ADD_NAME]);
  372.  
  373.                             String += strlen(String) + 1;
  374.  
  375.                             Node -> Sequence = String;
  376.  
  377.                             CopyMem(LocalBuffer,String,NameLen);
  378.  
  379.                             String += NameLen;
  380.  
  381.                             Node -> Command = String;
  382.  
  383.                             strcpy(String,Args[ARG_ADD_COMMAND]);
  384.  
  385.                             Node -> SequenceLen = NameLen;
  386.                             Node -> Count = 0;
  387.  
  388.                             AddGenericListNode(List,Node,AddMode);
  389.                         }
  390.                         else
  391.                         {
  392.                             Results[0] = RC_ERROR;
  393.                             Results[1] = ERROR_NO_FREE_STORE;
  394.                         }
  395.                     }
  396.                     else
  397.                     {
  398.                         Results[0] = RC_ERROR;
  399.                         Results[1] = ERROR_REQUIRED_ARG_MISSING;
  400.                     }
  401.                 }
  402.                 else
  403.                 {
  404.                     if(Args[ARG_ADD_NAME])
  405.                     {
  406.                         struct Node *Node;
  407.  
  408.                         if(Node = CreateGenericListNode(sizeof(struct DialNode),Args[ARG_ADD_NAME]))
  409.                             AddGenericListNode(List,Node,AddMode);
  410.                         else
  411.                         {
  412.                             Results[0] = RC_ERROR;
  413.                             Results[1] = ERROR_NO_FREE_STORE;
  414.                         }
  415.                     }
  416.                     else
  417.                     {
  418.                         Results[0] = RC_ERROR;
  419.                         Results[1] = TERMERROR_WRONG_LIST;
  420.                     }
  421.                 }
  422.             }
  423.         }
  424.     }
  425.     else
  426.     {
  427.         Results[0] = RC_ERROR;
  428.         Results[1] = TERMERROR_UNKNOWN_LIST;
  429.     }
  430.  
  431.     return(NULL);
  432. }
  433.  
  434. STRPTR
  435. RexxBaud(struct RexxPkt *Pkt)
  436. {
  437.     enum    {    ARG_BAUD_RATE };
  438.  
  439.     LONG Rate = *(LONG *)Args[ARG_BAUD_RATE],Min = MILLION,Diff,Index;
  440.     LONG i;
  441.  
  442.     for(i = 0 ; i < NumBaudRates ; i++)
  443.     {
  444.         Diff = Rate - BaudRates[i];
  445.  
  446.         if(Diff >= 0 && Diff < Min)
  447.         {
  448.             Min    = Diff;
  449.             Index    = i;
  450.         }
  451.     }
  452.  
  453.     if(BaudRates[Index] != Config -> SerialConfig -> BaudRate)
  454.     {
  455.         Config -> SerialConfig -> BaudRate = BaudRates[Index];
  456.  
  457.         ConfigChanged = TRUE;
  458.  
  459.         UpdateRequired = TRUE;
  460.     }
  461.  
  462.     return(NULL);
  463. }
  464.  
  465. STRPTR
  466. RexxBeepScreen(struct RexxPkt *Pkt)
  467. {
  468.     BellSignal();
  469.  
  470.     return(NULL);
  471. }
  472.  
  473. STRPTR
  474. RexxCallMenu(struct RexxPkt *Pkt)
  475. {
  476.     enum    {    ARG_CALLMENU_TITLE };
  477.  
  478.     STRPTR Buffer;
  479.  
  480.     if(Buffer = CreateMatchBuffer(Args[ARG_CALLMENU_TITLE]))
  481.     {
  482.         LONG i;
  483.  
  484.         Results[0] = RC_WARN;
  485.  
  486.             /* Scan the menu list... */
  487.  
  488.         for(i = 0 ; TermMenu[i] . nm_Type != NM_END ; i++)
  489.         {
  490.                 /* Did we get a valid name string? */
  491.  
  492.             if(TermMenu[i] . nm_Label != NM_BARLABEL)
  493.             {
  494.                     /* Does the name match our template? */
  495.  
  496.                 if(MatchBuffer(Buffer,TermMenu[i] . nm_Label))
  497.                 {
  498.                     HandleMenuCode((ULONG)TermMenu[i] . nm_UserData,NULL);
  499.  
  500.                     Results[0] = RC_OK;
  501.  
  502.                     break;
  503.                 }
  504.             }
  505.         }
  506.  
  507.         DeleteMatchBuffer(Buffer);
  508.     }
  509.     else
  510.     {
  511.         Results[0] = RC_ERROR;
  512.         Results[1] = ERROR_NO_FREE_STORE;
  513.     }
  514.  
  515.     return(NULL);
  516. }
  517.  
  518. STRPTR
  519. RexxCapture(struct RexxPkt *Pkt)
  520. {
  521.     enum    {    ARG_CAPTURE_TO,ARG_CAPTURE_NAME };
  522.  
  523.     if(!Stricmp(Args[ARG_CAPTURE_TO],"PRINTER"))
  524.     {
  525.         if(!PrinterCapture)
  526.             OpenPrinterCapture(FALSE);
  527.     }
  528.     else
  529.     {
  530.         if(!Stricmp(Args[ARG_CAPTURE_TO],"FILE"))
  531.         {
  532.             if(FileCapture)
  533.             {
  534.                 Results[0] = RC_ERROR;
  535.                 Results[1] = ERROR_OBJECT_IN_USE;
  536.             }
  537.             else
  538.             {
  539.                 if(Args[ARG_CAPTURE_NAME])
  540.                 {
  541.                     if(FileCapture = BufferOpen(Args[ARG_CAPTURE_NAME],"a"))
  542.                         strcpy(CaptureName,Args[ARG_CAPTURE_NAME]);
  543.                     else
  544.                     {
  545.                         Results[0] = RC_ERROR;
  546.                         Results[1] = IoErr();
  547.                     }
  548.                 }
  549.                 else
  550.                 {
  551.                     UBYTE             DummyBuffer[MAX_FILENAME_LENGTH],
  552.                                 *DummyChar;
  553.                     struct FileRequester    *FileRequest;
  554.  
  555.                     if(!CaptureName[0])
  556.                     {
  557.                         strcpy(CaptureName,Config -> CaptureConfig -> CapturePath);
  558.  
  559.                         if(!AddPart(CaptureName,LocaleString(MSG_DIALPANEL_CAPTURE_NAME_TXT),MAX_FILENAME_LENGTH))
  560.                             CaptureName[0] = 0;
  561.                     }
  562.  
  563.                     strcpy(DummyBuffer,CaptureName);
  564.  
  565.                     DummyChar = PathPart(DummyBuffer);
  566.  
  567.                     *DummyChar = 0;
  568.  
  569.                     BlockWindows();
  570.  
  571.                     if(FileRequest = GetFile(Window,LocaleString(MSG_TERMMAIN_CAPTURE_TO_DISK_TXT),DummyBuffer,FilePart(CaptureName),DummyBuffer,NULL,TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_OPEN_TXT),FALSE))
  572.                     {
  573.                         BOOL Continue;
  574.  
  575.                         if(GetFileSize(DummyBuffer))
  576.                         {
  577.                             Continue = TRUE;
  578.  
  579.                             switch(ShowRequest(Window,LocaleString(MSG_GLOBAL_FILE_ALREADY_EXISTS_TXT),LocaleString(MSG_GLOBAL_CREATE_APPEND_CANCEL_TXT),DummyBuffer))
  580.                             {
  581.                                 case 1:
  582.  
  583.                                     FileCapture = BufferOpen(DummyBuffer,"w");
  584.                                     break;
  585.  
  586.                                 case 2:
  587.  
  588.                                     FileCapture = BufferOpen(DummyBuffer,"a");
  589.                                     break;
  590.  
  591.                                 case 0:
  592.  
  593.                                     Results[0] = RC_WARN;
  594.                                     Continue = FALSE;
  595.                                     break;
  596.                             }
  597.                         }
  598.                         else
  599.                         {
  600.                             Continue = TRUE;
  601.  
  602.                             FileCapture = BufferOpen(DummyBuffer,"w");
  603.                         }
  604.  
  605.                         if(Continue)
  606.                         {
  607.                             if(!FileCapture)
  608.                             {
  609.                                 ShowRequest(Window,LocaleString(MSG_GLOBAL_ERROR_OPENING_FILE_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
  610.  
  611.                                 Results[0] = RC_ERROR;
  612.                                 Results[1] = IoErr();
  613.                             }
  614.                             else
  615.                             {
  616.                                 strcpy(CaptureName,DummyBuffer);
  617.  
  618.                                 CheckItem(MEN_CAPTURE_TO_FILE,TRUE);
  619.                             }
  620.                         }
  621.  
  622.                         FreeAslRequest(FileRequest);
  623.                     }
  624.  
  625.                     ReleaseWindows();
  626.                 }
  627.             }
  628.         }
  629.         else
  630.         {
  631.             Results[0] = RC_ERROR;
  632.             Results[1] = ERROR_REQUIRED_ARG_MISSING;
  633.         }
  634.     }
  635.  
  636.     ConOutputUpdate();
  637.  
  638.     Forbid();
  639.  
  640.     CheckItem(MEN_CAPTURE_TO_FILE,        FileCapture != NULL);
  641.     CheckItem(MEN_CAPTURE_TO_PRINTER,    PrinterCapture != NULL);
  642.  
  643.     Permit();
  644.  
  645.     return(NULL);
  646. }
  647.  
  648. STRPTR
  649. RexxClear(struct RexxPkt *Pkt)
  650. {
  651.     enum    {    ARG_CLEAR_FROM,ARG_CLEAR_FORCE };
  652.  
  653.     if(!Stricmp(Args[ARG_CLEAR_FROM],"BUFFER"))
  654.     {
  655.         if(Lines)
  656.         {
  657.             if(Args[ARG_CLEAR_FORCE])
  658.             {
  659.                 FreeBuffer();
  660.  
  661.                 TerminateBuffer();
  662.             }
  663.             else
  664.             {
  665.                 BlockWindows();
  666.  
  667.                 if(ShowRequest(Window,LocaleString(MSG_TERMMAIN_BUFFER_STILL_HOLDS_LINES_TXT),LocaleString(MSG_GLOBAL_YES_NO_TXT),Lines))
  668.                 {
  669.                     FreeBuffer();
  670.  
  671.                     TerminateBuffer();
  672.                 }
  673.                 else
  674.                     Results[0] = RC_WARN;
  675.  
  676.                 ReleaseWindows();
  677.             }
  678.         }
  679.     }
  680.     else
  681.     {
  682.         LONG ListIndex;
  683.  
  684.         if((ListIndex = ToList(Args[ARG_CLEAR_FROM])) != -1)
  685.             ClearGenericList(GenericListTable[ListIndex]);
  686.         else
  687.         {
  688.             Results[0] = RC_ERROR;
  689.             Results[1] = TERMERROR_UNKNOWN_LIST;
  690.         }
  691.     }
  692.  
  693.     return(NULL);
  694. }
  695.  
  696. STRPTR
  697. RexxClearScreen(struct RexxPkt *Pkt)
  698. {
  699.     if(XEmulatorBase && Config -> TerminalConfig -> EmulationMode == EMULATION_EXTERNAL)
  700.         XEmulatorClearConsole(XEM_IO);
  701.     else
  702.     {
  703.         DropMarker();
  704.  
  705.         ConBypass("\033[2J\033[H",-1);
  706.     }
  707.  
  708.     return(NULL);
  709. }
  710.  
  711. STRPTR
  712. RexxClose(struct RexxPkt *Pkt)
  713. {
  714.     enum    {    ARG_CLOSE_FROM };
  715.  
  716.     STATIC STRPTR ValidArgs[3] =
  717.     {
  718.         "PRINTER",
  719.         "FILE",
  720.         "ALL"
  721.     };
  722.  
  723.     LONG i;
  724.  
  725.     for(i = 0 ; i < 3 ; i++)
  726.     {
  727.         if(!Stricmp(Args[ARG_CLOSE_FROM],ValidArgs[i]))
  728.         {
  729.             if(i == 0 || i == 2)
  730.             {
  731.                 if(PrinterCapture)
  732.                     ClosePrinterCapture(TRUE);
  733.             }
  734.  
  735.             if(i == 1 || i == 2)
  736.             {
  737.                 if(FileCapture)
  738.                 {
  739.                     BufferClose(FileCapture);
  740.  
  741.                     CheckItem(MEN_CAPTURE_TO_FILE,FALSE);
  742.  
  743.                     FileCapture = NULL;
  744.  
  745.                     if(!GetFileSize(CaptureName))
  746.                         DeleteFile(CaptureName);
  747.                     else
  748.                     {
  749.                         AddProtection(CaptureName,FIBF_EXECUTE);
  750.  
  751.                         if(Config -> MiscConfig -> CreateIcons)
  752.                             AddIcon(CaptureName,FILETYPE_TEXT,TRUE);
  753.                     }
  754.  
  755.                     ConOutputUpdate();
  756.                 }
  757.             }
  758.  
  759.             return(NULL);
  760.         }
  761.     }
  762.  
  763.     Results[0] = RC_ERROR;
  764.     Results[1] = ERROR_TOO_MANY_ARGS;
  765.  
  766.     return(NULL);
  767. }
  768.  
  769. STRPTR
  770. RexxCloseDevice(struct RexxPkt *Pkt)
  771. {
  772.     ClearSerial();
  773.  
  774.     DeleteSerial();
  775.  
  776.     return(NULL);
  777. }
  778.  
  779. STRPTR
  780. RexxCloseRequester(struct RexxPkt *Pkt)
  781. {
  782.     if(ThisProcess)
  783.         Signal(ThisProcess,SIG_BREAK);
  784.     else
  785.         Results[0] = RC_WARN;
  786.  
  787.     return(NULL);
  788. }
  789.  
  790. STRPTR
  791. RexxDeactivate(struct RexxPkt *Pkt)
  792. {
  793.     Forbid();
  794.  
  795.     if(Window)
  796.         DoIconify = TRUE;
  797.  
  798.     Permit();
  799.  
  800.     return(NULL);
  801. }
  802.  
  803. STRPTR
  804. RexxDial(struct RexxPkt *Pkt)
  805. {
  806.     enum    {    ARG_SYNC,ARG_DIAL_NUM };
  807.  
  808.     struct PhoneNode    *DialNode;
  809.     struct GenericList    *List;
  810.  
  811.     if(Args[ARG_DIAL_NUM])
  812.     {
  813.         struct List *LocalList;
  814.  
  815.         if(LocalList = (struct List *)AllocVecPooled(sizeof(struct List),MEMF_ANY))
  816.         {
  817.             LONG Len = strlen(Args[ARG_DIAL_NUM]);
  818.  
  819.             NewList(LocalList);
  820.  
  821.             if(DialNode = (struct PhoneNode *)AllocVecPooled(sizeof(struct PhoneNode) + Len + 1,MEMF_ANY | MEMF_CLEAR))
  822.             {
  823.                 DialNode -> VanillaNode . ln_Name = (STRPTR)(DialNode + 1);
  824.  
  825.                 strcpy(DialNode -> VanillaNode . ln_Name,Args[ARG_DIAL_NUM]);
  826.  
  827.                 AddTail(LocalList,&DialNode -> VanillaNode);
  828.  
  829.                 FreeDialList(TRUE);
  830.  
  831.                 DialList = LocalList;
  832.             }
  833.             else
  834.             {
  835.                 FreeVecPooled(LocalList);
  836.  
  837.                 Results[0] = RC_ERROR;
  838.                 Results[1] = ERROR_NO_FREE_STORE;
  839.  
  840.                 return(NULL);
  841.             }
  842.         }
  843.     }
  844.     else
  845.     {
  846.         if(GenericListCount(List = GenericListTable[GLIST_DIAL]))
  847.         {
  848.             struct DialNode *Node = (struct DialNode *)FirstGenericListNode(List);
  849.  
  850.             if(Node)
  851.             {
  852.                 LONG Len;
  853.  
  854.                 if(!DialList)
  855.                 {
  856.                     if(DialList = (struct List *)AllocVecPooled(sizeof(struct List),MEMF_ANY | MEMF_CLEAR))
  857.                         NewList(DialList);
  858.                 }
  859.  
  860.                 if(DialList)
  861.                 {
  862.                     while(Node)
  863.                     {
  864.                         if(Node -> Entry)
  865.                             Len = 0;
  866.                         else
  867.                             Len = strlen(Node -> Node . ln_Name) + 1;
  868.  
  869.                         if(DialNode = (struct PhoneNode *)AllocVecPooled(sizeof(struct PhoneNode) + Len,MEMF_ANY | MEMF_CLEAR))
  870.                         {
  871.                             if(Node -> Entry)
  872.                                 DialNode -> Entry = Node -> Entry;
  873.                             else
  874.                             {
  875.                                 DialNode -> VanillaNode . ln_Name = (STRPTR)(DialNode + 1);
  876.  
  877.                                 strcpy(DialNode -> VanillaNode . ln_Name,Node -> Node . ln_Name);
  878.                             }
  879.  
  880.                             AddTail(DialList,&DialNode -> VanillaNode);
  881.                         }
  882.                         else
  883.                         {
  884.                             FreeDialList(FALSE);
  885.  
  886.                             Results[0] = RC_ERROR;
  887.                             Results[1] = ERROR_NO_FREE_STORE;
  888.  
  889.                             return(NULL);
  890.                         }
  891.  
  892.                         Node = (struct DialNode *)NextGenericListNode(List);
  893.                     }
  894.                 }
  895.             }
  896.         }
  897.     }
  898.  
  899.     if(DialList)
  900.     {
  901.         if(DialList -> lh_Head -> ln_Succ)
  902.         {
  903.             DoDial = DIAL_LIST;
  904.  
  905.             Forbid();
  906.  
  907.             if(!DialMsg && Args[ARG_SYNC])
  908.             {
  909.                 DialMsg = Pkt -> RexxMsg;
  910.  
  911.                 Pkt -> RexxMsg = NULL;
  912.             }
  913.  
  914.             Permit();
  915.         }
  916.         else
  917.         {
  918.             FreeDialList(FALSE);
  919.  
  920.             Results[0] = RC_ERROR;
  921.             Results[1] = TERMERROR_LIST_IS_ALREADY_EMPTY;
  922.         }
  923.     }
  924.     else
  925.     {
  926.         Results[0] = RC_ERROR;
  927.         Results[1] = ERROR_NO_FREE_STORE;
  928.     }
  929.  
  930.     return(NULL);
  931. }
  932.  
  933. STRPTR
  934. RexxDelay(struct RexxPkt *Pkt)
  935. {
  936.     enum    {    ARG_DELAY_MICROSECONDS,ARG_DELAY_SECONDS,ARG_DELAY_MINUTES,ARG_DELAY_QUIET };
  937.  
  938.     LONG    Seconds = 0,
  939.         Micros;
  940.     ULONG    Signals;
  941.     BOOL    Quiet;
  942.  
  943.     if(Args[ARG_DELAY_QUIET] || !ReadRequest || !WriteRequest)
  944.         Quiet = TRUE;
  945.     else
  946.         Quiet = FALSE;
  947.  
  948.     if(Args[ARG_DELAY_MINUTES])
  949.         Seconds += 60 * (*(LONG *)Args[ARG_DELAY_MINUTES]);
  950.  
  951.     if(Args[ARG_DELAY_SECONDS])
  952.         Seconds += *(LONG *)Args[ARG_DELAY_SECONDS];
  953.  
  954.     if(Args[ARG_DELAY_MICROSECONDS])
  955.         Micros = *(LONG *)Args[ARG_DELAY_MICROSECONDS];
  956.     else
  957.         Micros = 0;
  958.  
  959.     if(Seconds || Micros)
  960.     {
  961.         StartTime(Seconds,Micros);
  962.  
  963.         BlockWindows();
  964.  
  965.         if(Marking)
  966.             DropMarker();
  967.  
  968.         if(Quiet)
  969.             Signals = NULL;
  970.         else
  971.         {
  972.             if(DataHold)
  973.             {
  974.                 ConProcess(DataHold,DataSize);
  975.  
  976.                 Status = STATUS_READY;
  977.  
  978.                 DataHold = NULL;
  979.  
  980.                 RestartSerial();
  981.             }
  982.  
  983.             Signals = CheckSignal(SIG_SERIAL);
  984.         }
  985.  
  986.         FOREVER
  987.         {
  988.             if(Signals & SIG_SERIAL)
  989.             {
  990.                 if(!WaitSerialRead())
  991.                 {
  992.                     LONG Length;
  993.  
  994.                     BytesIn++;
  995.  
  996.                     if(Translate_CR_LF)
  997.                         Length = (* Translate_CR_LF)(ReadBuffer,1);
  998.                     else
  999.                         Length = 1;
  1000.  
  1001.                     if(Length)
  1002.                     {
  1003.                         ConProcess(ReadBuffer,Length);
  1004.  
  1005.                         Status = STATUS_READY;
  1006.                     }
  1007.  
  1008.                         /* Check how many bytes are still in
  1009.                          * the serial buffer.
  1010.                          */
  1011.  
  1012.                     if(Length = GetSerialWaiting())
  1013.                     {
  1014.                         if(Length > SerialBufferSize)
  1015.                             Length = SerialBufferSize;
  1016.  
  1017.                         if(Length > Config -> SerialConfig -> Quantum)
  1018.                             Length = Config -> SerialConfig -> Quantum;
  1019.  
  1020.                         if(!DoSerialRead(ReadBuffer,Length))
  1021.                         {
  1022.                             BytesIn += Length;
  1023.  
  1024.                             if(Translate_CR_LF)
  1025.                                 Length = (* Translate_CR_LF)(ReadBuffer,Length);
  1026.  
  1027.                                 /* Send the data to the console. */
  1028.  
  1029.                             if(Length)
  1030.                                 ConProcess(ReadBuffer,Length);
  1031.  
  1032.                             Status = STATUS_READY;
  1033.                         }
  1034.                     }
  1035.                 }
  1036.  
  1037.                 RestartSerial();
  1038.             }
  1039.  
  1040.             if(Signals & SIG_BREAK)
  1041.             {
  1042.                 StopTime();
  1043.  
  1044.                 Results[0] = RC_WARN;
  1045.  
  1046.                 break;
  1047.             }
  1048.  
  1049.             if(Signals & SIG_TIMER)
  1050.             {
  1051.                 WaitTime();
  1052.  
  1053.                 break;
  1054.             }
  1055.  
  1056.             if(Quiet)
  1057.                 Signals = Wait(SIG_TIMER | SIG_BREAK);
  1058.             else
  1059.                 Signals = Wait(SIG_TIMER | SIG_BREAK | SIG_SERIAL);
  1060.         }
  1061.  
  1062.         ReleaseWindows();
  1063.     }
  1064.  
  1065.     return(NULL);
  1066. }
  1067.  
  1068. STRPTR
  1069. RexxDuplex(struct RexxPkt *Pkt)
  1070. {
  1071.     enum    {    ARG_DUPLEX_FULL,ARG_DUPLEX_HALF };
  1072.  
  1073.     LONG Mode;
  1074.  
  1075.     if(Args[ARG_DUPLEX_FULL])
  1076.         Mode = DUPLEX_FULL;
  1077.  
  1078.     if(Args[ARG_DUPLEX_HALF])
  1079.         Mode = DUPLEX_HALF;
  1080.  
  1081.     if(Config -> SerialConfig -> Duplex != Mode)
  1082.     {
  1083.         Config -> SerialConfig -> Duplex = Mode;
  1084.  
  1085.         UpdateRequired = TRUE;
  1086.  
  1087.         ConfigChanged = TRUE;
  1088.     }
  1089.  
  1090.     return(NULL);
  1091. }
  1092.  
  1093. STRPTR
  1094. RexxFault(struct RexxPkt *Pkt)
  1095. {
  1096.     enum    {    ARG_FAULT_CODE };
  1097.  
  1098.     LONG    Code = *(LONG *)Args[ARG_FAULT_CODE];
  1099.     UBYTE    RexxResultString[MAX_FILENAME_LENGTH];
  1100.     STRPTR    Result;
  1101.  
  1102.     if(Code >= ERR10_001 && Code <= ERR10_048)
  1103.         Result = LocaleString(MSG_AREXX_SYSERR10_001_TXT + Code - ERR10_001);
  1104.     else
  1105.     {
  1106.         if(Code >= TERMERROR_NO_DATA_TO_PROCESS && Code <= TERMERROR_WRONG_LIST)
  1107.             Result = LocaleString(MSG_AREXX_HOSTERR_000_TXT + Code - TERMERROR_NO_DATA_TO_PROCESS);
  1108.         else
  1109.         {
  1110.             Fault(Code,"",RexxResultString,MAX_FILENAME_LENGTH);
  1111.  
  1112.             Result = &RexxResultString[2];
  1113.         }
  1114.     }
  1115.  
  1116.     return(CreateResult(Result,Results));
  1117. }
  1118.  
  1119. STRPTR
  1120. RexxGetClip(struct RexxPkt *Pkt)
  1121. {
  1122.     enum    {    ARG_GETCLIP_UNIT };
  1123.  
  1124.     struct IFFHandle    *Handle;
  1125.     STRPTR             ResultBuffer = NULL;
  1126.  
  1127.     if(Handle = AllocIFF())
  1128.     {
  1129.         if(Args[ARG_GETCLIP_UNIT])
  1130.             Handle -> iff_Stream = (ULONG)OpenClipboard(*(LONG *)Args[ARG_GETCLIP_UNIT]);
  1131.         else
  1132.             Handle -> iff_Stream = (ULONG)OpenClipboard(Config -> ClipConfig -> ClipboardUnit);
  1133.  
  1134.         if(Handle -> iff_Stream)
  1135.         {
  1136.             InitIFFasClip(Handle);
  1137.  
  1138.             if(!OpenIFF(Handle,IFFF_READ))
  1139.             {
  1140.                 if(!StopChunk(Handle,ID_FTXT,ID_CHRS))
  1141.                 {
  1142.                     if(!ParseIFF(Handle,IFFPARSE_SCAN))
  1143.                     {
  1144.                         struct ContextNode *ContextNode;
  1145.  
  1146.                         ContextNode = CurrentChunk(Handle);
  1147.  
  1148.                         if(ContextNode -> cn_Type == ID_FTXT && ContextNode -> cn_Size > 0)
  1149.                         {
  1150.                             STRPTR Result;
  1151.  
  1152.                             if(Result = (STRPTR)AllocVecPooled(ContextNode -> cn_Size,MEMF_ANY))
  1153.                             {
  1154.                                 if(ReadChunkBytes(Handle,Result,ContextNode -> cn_Size) == ContextNode -> cn_Size)
  1155.                                     ResultBuffer = CreateArgstring(Result,ContextNode -> cn_Size);
  1156.  
  1157.                                 FreeVecPooled(Result);
  1158.                             }
  1159.                             else
  1160.                             {
  1161.                                 Results[0] = RC_ERROR;
  1162.                                 Results[1] = ERROR_NO_FREE_STORE;
  1163.                             }
  1164.                         }
  1165.                         else
  1166.                             Results[0] = RC_WARN;
  1167.                     }
  1168.                     else
  1169.                     {
  1170.                         Results[0] = RC_ERROR;
  1171.                         Results[1] = ERROR_OBJECT_NOT_FOUND;
  1172.                     }
  1173.                 }
  1174.                 else
  1175.                 {
  1176.                     Results[0] = RC_ERROR;
  1177.                     Results[1] = ERROR_OBJECT_NOT_FOUND;
  1178.                 }
  1179.  
  1180.                 CloseIFF(Handle);
  1181.             }
  1182.             else
  1183.             {
  1184.                 Results[0] = RC_ERROR;
  1185.                 Results[1] = ERROR_OBJECT_NOT_FOUND;
  1186.             }
  1187.  
  1188.             CloseClipboard((struct ClipboardHandle *)Handle -> iff_Stream);
  1189.         }
  1190.         else
  1191.         {
  1192.             Results[0] = RC_ERROR;
  1193.             Results[1] = TERMERROR_UNIT_NOT_AVAILABLE;
  1194.         }
  1195.  
  1196.         FreeIFF(Handle);
  1197.     }
  1198.     else
  1199.     {
  1200.         Results[0] = RC_ERROR;
  1201.         Results[1] = ERROR_OBJECT_NOT_FOUND;
  1202.     }
  1203.  
  1204.     return(ResultBuffer);
  1205. }
  1206.  
  1207. STRPTR
  1208. RexxGoOnline(struct RexxPkt *Pkt)
  1209. {
  1210.     if(!Online)
  1211.     {
  1212.         SetOnlineState(TRUE);
  1213.  
  1214.         BaudCount        = 0;
  1215.         BaudBuffer[0]        = 0;
  1216.         BaudPending        = FALSE;
  1217.  
  1218.         ObtainSemaphore(&PatternSemaphore);
  1219.  
  1220.         ChosenEntry        = NULL;
  1221.         ChosenPattern        = NULL;
  1222.  
  1223.         ReleaseSemaphore(&PatternSemaphore);
  1224.  
  1225.         Password[0]        = 0;
  1226.         UserName[0]        = 0;
  1227.         SendStartup        = FALSE;
  1228.         LimitCount        = -1;
  1229.         CurrentBBSName[0]    = 0;
  1230.         CurrentBBSComment[0]    = 0;
  1231.         CurrentBBSNumber[0]    = 0;
  1232.  
  1233.         Forbid();
  1234.  
  1235.         SetDialMenu(FALSE);
  1236.  
  1237.         Permit();
  1238.     }
  1239.  
  1240.     return(NULL);
  1241. }
  1242.  
  1243. STRPTR
  1244. RexxHangup(struct RexxPkt *Pkt)
  1245. {
  1246.     if(!WriteRequest)
  1247.     {
  1248.         Results[0] = RC_WARN;
  1249.  
  1250.         return(NULL);
  1251.     }
  1252.  
  1253.     BlockWindows();
  1254.  
  1255.     HangUp();
  1256.  
  1257.         /* We are no longer online. */
  1258.  
  1259.     SetOnlineState(FALSE);
  1260.  
  1261.         /* Reset time limit. */
  1262.  
  1263.     LimitCount = -1;
  1264.  
  1265.         /* Clear the password. */
  1266.  
  1267.     Password[0]        = 0;
  1268.     UserName[0]        = 0;
  1269.  
  1270.     CurrentBBSName[0]    = 0;
  1271.     CurrentBBSComment[0]    = 0;
  1272.     CurrentBBSNumber[0]    = 0;
  1273.  
  1274.         /* Note the  last action. */
  1275.  
  1276.     LogAction(LocaleString(MSG_TERMMAIN_LOGMSG_HANG_UP_TXT));
  1277.  
  1278.     ReleaseWindows();
  1279.  
  1280.         /* Execute logoff macro. */
  1281.  
  1282.     if(WasOnline && Config -> CommandConfig -> LogoffMacro[0])
  1283.         SerialCommand(Config -> CommandConfig -> LogoffMacro);
  1284.  
  1285.         /* Update the logfile. */
  1286.  
  1287.     StopCall(FALSE);
  1288.  
  1289.         /* Don't execute the logoff macro twice. */
  1290.  
  1291.     ObtainSemaphore(&OnlineSemaphore);
  1292.  
  1293.     WasOnline = FALSE;
  1294.  
  1295.     ReleaseSemaphore(&OnlineSemaphore);
  1296.  
  1297.         /* Enable the dialing functions. */
  1298.  
  1299.     SetDialMenu(TRUE);
  1300.  
  1301.     if(Config -> ModemConfig -> RedialAfterHangup)
  1302.     {
  1303.         if(DialList)
  1304.         {
  1305.             if(DialList -> lh_Head -> ln_Succ)
  1306.                 DoDial = DIAL_REDIAL;
  1307.         }
  1308.     }
  1309.  
  1310.     ObtainSemaphore(&PatternSemaphore);
  1311.  
  1312.     ChosenEntry    = NULL;
  1313.     ChosenPattern    = NULL;
  1314.  
  1315.     ReleaseSemaphore(&PatternSemaphore);
  1316.  
  1317.     return(NULL);
  1318. }
  1319.  
  1320. STRPTR
  1321. RexxHelp(struct RexxPkt *Pkt)
  1322. {
  1323.     enum    {    ARG_HELP_COMMAND,ARG_HELP_PROMPT };
  1324.  
  1325.     if(Args[ARG_HELP_PROMPT])
  1326.         GuideSetup();
  1327.     else
  1328.     {
  1329.         LONG i;
  1330.  
  1331.         for(i = 0 ; i < CommandTableSize ; i++)
  1332.         {
  1333.             if(!Stricmp(Args[ARG_HELP_COMMAND],CommandTable[i] . Name))
  1334.             {
  1335.                 if(CommandTable[i] . Arguments)
  1336.                     return(CreateResult(CommandTable[i] . Arguments,Results));
  1337.                 else
  1338.                     return(CreateResult(",",Results));
  1339.             }
  1340.         }
  1341.  
  1342.         Results[0] = RC_ERROR;
  1343.         Results[1] = ERROR_OBJECT_NOT_FOUND;
  1344.     }
  1345.  
  1346.     return(NULL);
  1347. }
  1348.  
  1349. STRPTR
  1350. RexxOpen(struct RexxPkt *Pkt)
  1351. {
  1352.     enum    {    ARG_OPEN_NAME,ARG_OPEN_TO };
  1353.  
  1354.     LONG Index = ToConfig(Args[ARG_OPEN_TO]);
  1355.  
  1356.     if(Index == -1 || Index > DATATYPE_PHONEBOOK)
  1357.     {
  1358.         Results[0] = RC_ERROR;
  1359.         Results[1] = ERROR_OBJECT_NOT_FOUND;
  1360.     }
  1361.     else
  1362.     {
  1363.         UBYTE    DummyBuffer[MAX_FILENAME_LENGTH];
  1364.         STRPTR    FileName;
  1365.  
  1366.         if(Args[ARG_OPEN_NAME])
  1367.             FileName = Args[ARG_OPEN_NAME];
  1368.         else
  1369.         {
  1370.             STRPTR             Title;
  1371.             struct FileRequester    *FileRequest;
  1372.  
  1373.             FileName = NULL;
  1374.  
  1375.             switch(Index)
  1376.             {
  1377.                 case DATATYPE_TRANSLATIONS:
  1378.  
  1379.                     Title = LocaleString(MSG_PHONEPANEL_SELECT_TRANSLATION_TXT);
  1380.                     break;
  1381.  
  1382.                 case DATATYPE_FUNCTIONKEYS:
  1383.  
  1384.                     Title = LocaleString(MSG_PHONEPANEL_SELECT_KEYBOARD_MACROS_TXT);
  1385.                     break;
  1386.  
  1387.                 case DATATYPE_CURSORKEYS:
  1388.  
  1389.                     Title = LocaleString(MSG_PHONEPANEL_SELECT_CURSOR_KEYS_TXT);
  1390.                     break;
  1391.  
  1392.                 case DATATYPE_FASTMACROS:
  1393.  
  1394.                     Title = LocaleString(MSG_PHONEPANEL_SELECT_FAST_MACROS_TXT);
  1395.                     break;
  1396.  
  1397.                 case DATATYPE_HOTKEYS:
  1398.  
  1399.                     Title = LocaleString(MSG_HOTKEYPANEL_LOAD_HOTKEYS_TXT);
  1400.                     break;
  1401.  
  1402.                 case DATATYPE_SPEECH:
  1403.  
  1404.                     Title = LocaleString(MSG_SPEECHPANEL_LOAD_SPEECH_SETTINGS_TXT);
  1405.                     break;
  1406.  
  1407.                 case DATATYPE_SOUND:
  1408.  
  1409.                     Title = LocaleString(MSG_SOUNDPANEL_LOAD_SOUNDS_TXT);
  1410.                     break;
  1411.  
  1412.                 case DATATYPE_BUFFER:
  1413.  
  1414.                     Title = LocaleString(MSG_TERMMAIN_LOAD_BUFFER_TXT);
  1415.                     break;
  1416.  
  1417.                 case DATATYPE_CONFIGURATION:
  1418.  
  1419.                     Title = LocaleString(MSG_TERMMAIN_OPEN_PREFERENCES_TXT);
  1420.                     break;
  1421.  
  1422.                 case DATATYPE_PHONEBOOK:
  1423.  
  1424.                     Title = LocaleString(MSG_PHONEPANEL_LOAD_PHONEBOOK_TXT);
  1425.                     break;
  1426.             }
  1427.  
  1428.             BlockWindows();
  1429.  
  1430.             if(FileRequest = GetFile(Window,Title,"","",DummyBuffer,NULL,FALSE,FALSE,FALSE,"Ok",TRUE))
  1431.             {
  1432.                 FileName = DummyBuffer;
  1433.  
  1434.                 FreeAslRequest(FileRequest);
  1435.             }
  1436.             else
  1437.                 Results[0] = RC_WARN;
  1438.  
  1439.             ReleaseWindows();
  1440.         }
  1441.  
  1442.         if(FileName)
  1443.         {
  1444.             if(!GetFileSize(FileName))
  1445.             {
  1446.                 Results[0] = RC_ERROR;
  1447.                 Results[1] = ERROR_OBJECT_NOT_FOUND;
  1448.  
  1449.                 return(NULL);
  1450.             }
  1451.  
  1452.             BlockWindows();
  1453.  
  1454.             switch(Index)
  1455.             {
  1456.                 case DATATYPE_TRANSLATIONS:
  1457.                 {
  1458.                     struct TranslationEntry    **Send,
  1459.                                 **Receive = NULL;
  1460.                     BOOL            Success = FALSE;
  1461.  
  1462.                     if(Send = AllocTranslationTable())
  1463.                     {
  1464.                         if(Receive = AllocTranslationTable())
  1465.                         {
  1466.                             if(!(Success = LoadTranslationTables(FileName,Send,Receive)))
  1467.                             {
  1468.                                 Results[0] = RC_ERROR;
  1469.                                 Results[1] = IoErr();
  1470.                             }
  1471.                         }
  1472.                         else
  1473.                         {
  1474.                             Results[0] = RC_ERROR;
  1475.                             Results[1] = ERROR_NO_FREE_STORE;
  1476.                         }
  1477.                     }
  1478.                     else
  1479.                     {
  1480.                         Results[0] = RC_ERROR;
  1481.                         Results[1] = ERROR_NO_FREE_STORE;
  1482.                     }
  1483.  
  1484.                     if(!Success)
  1485.                     {
  1486.                         if(Send)
  1487.                             FreeTranslationTable(Send);
  1488.  
  1489.                         if(Receive)
  1490.                             FreeTranslationTable(Receive);
  1491.                     }
  1492.                     else
  1493.                     {
  1494.                         strcpy(Config -> TranslationFileName,FileName);
  1495.  
  1496.                         strcpy(LastTranslation,FileName);
  1497.  
  1498.                         FreeTranslationTable(SendTable);
  1499.                         FreeTranslationTable(ReceiveTable);
  1500.  
  1501.                         SendTable    = Send;
  1502.                         ReceiveTable    = Receive;
  1503.                     }
  1504.                 }
  1505.  
  1506.                 break;
  1507.  
  1508.                 case DATATYPE_FUNCTIONKEYS:
  1509.                 {
  1510.                     if(!LoadMacros(FileName,MacroKeys))
  1511.                     {
  1512.                         Results[0] = RC_ERROR;
  1513.                         Results[1] = IoErr();
  1514.                     }
  1515.                     else
  1516.                     {
  1517.                         MacroChanged = FALSE;
  1518.  
  1519.                         strcpy(LastMacros,FileName);
  1520.  
  1521.                         strcpy(Config -> MacroFileName,LastMacros);
  1522.                     }
  1523.                 }
  1524.  
  1525.                 break;
  1526.  
  1527.                 case DATATYPE_CURSORKEYS:
  1528.                 {
  1529.                     if(!ReadIFFData(FileName,CursorKeys,sizeof(struct CursorKeys),ID_KEYS))
  1530.                     {
  1531.                         Results[0] = RC_ERROR;
  1532.                         Results[1] = IoErr();
  1533.                     }
  1534.                     else
  1535.                     {
  1536.                         CursorKeysChanged = FALSE;
  1537.  
  1538.                         strcpy(LastCursorKeys,FileName);
  1539.  
  1540.                         strcpy(Config -> CursorFileName,LastCursorKeys);
  1541.                     }
  1542.                 }
  1543.  
  1544.                 break;
  1545.  
  1546.                 case DATATYPE_FASTMACROS:
  1547.                 {
  1548.                     if(!LoadFastMacros(FileName,&FastMacroList))
  1549.                     {
  1550.                         Results[0] = RC_ERROR;
  1551.                         Results[1] = IoErr();
  1552.                     }
  1553.                     else
  1554.                     {
  1555.                         strcpy(Config -> FastMacroFileName,FileName);
  1556.  
  1557.                         strcpy(LastFastMacros,FileName);
  1558.  
  1559.                         FastMacrosChanged = FALSE;
  1560.  
  1561.                         FastMacroCount = GetListSize(&FastMacroList);
  1562.                     }
  1563.  
  1564.                     RefreshFastWindow(TRUE);
  1565.                 }
  1566.  
  1567.                 break;
  1568.  
  1569.                 case DATATYPE_HOTKEYS:
  1570.                 {
  1571.                     if(!LoadHotkeys(FileName,&Hotkeys))
  1572.                     {
  1573.                         Results[0] = RC_ERROR;
  1574.                         Results[1] = IoErr();
  1575.                     }
  1576.                     else
  1577.                     {
  1578.                         strcpy(LastKeys,FileName);
  1579.                         strcpy(Config->HotkeyFileName,LastKeys);
  1580.  
  1581.                         HotkeysChanged = FALSE;
  1582.  
  1583.                         SetupCx();
  1584.                     }
  1585.                 }
  1586.  
  1587.                 break;
  1588.  
  1589.                 case DATATYPE_SPEECH:
  1590.                 {
  1591.                     if(!ReadIFFData(FileName,&SpeechConfig,sizeof(struct SpeechConfig),ID_SPEK))
  1592.                     {
  1593.                         Results[0] = RC_ERROR;
  1594.                         Results[1] = IoErr();
  1595.                     }
  1596.                     else
  1597.                     {
  1598.                         strcpy(LastSpeech,FileName);
  1599.                         strcpy(Config->SpeechFileName,LastSpeech);
  1600.  
  1601.                         SpeechSetup();
  1602.  
  1603.                         SpeechChanged = FALSE;
  1604.                     }
  1605.                 }
  1606.  
  1607.                 break;
  1608.  
  1609.                 case DATATYPE_SOUND:
  1610.                 {
  1611.                     if(!ReadIFFData(FileName,&SoundConfig,sizeof(struct SoundConfig),ID_SOUN))
  1612.                     {
  1613.                         Results[0] = RC_ERROR;
  1614.                         Results[1] = IoErr();
  1615.                     }
  1616.                     else
  1617.                     {
  1618.                         strcpy(LastSound,FileName);
  1619.                         strcpy(Config->SoundFileName,LastSound);
  1620.  
  1621.                         SoundInit();
  1622.  
  1623.                         SoundChanged = FALSE;
  1624.                     }
  1625.                 }
  1626.  
  1627.                 break;
  1628.  
  1629.                 case DATATYPE_BUFFER:
  1630.                 {
  1631.                     BPTR SomeFile;
  1632.  
  1633.                     if(SomeFile = Open(FileName,MODE_OLDFILE))
  1634.                     {
  1635.                         LONG Len;
  1636.  
  1637.                         LineRead(NULL,NULL,NULL);
  1638.  
  1639.                         while((Len = LineRead(SomeFile,FileName,80)) > 0)
  1640.                             CaptureParser(ParserStuff,FileName,Len,AddLine);
  1641.  
  1642.                         Close(SomeFile);
  1643.  
  1644.                         BufferChanged = TRUE;
  1645.                     }
  1646.                     else
  1647.                     {
  1648.                         Results[0] = RC_ERROR;
  1649.                         Results[1] = IoErr();
  1650.                     }
  1651.                 }
  1652.  
  1653.                 break;
  1654.  
  1655.                 case DATATYPE_CONFIGURATION:
  1656.                 {
  1657.                     if(ReadConfig(FileName,PrivateConfig))
  1658.                     {
  1659.                         SwapConfig(PrivateConfig,Config);
  1660.  
  1661.                         strcpy(LastConfig,FileName);
  1662.  
  1663.                         ConfigSetup();
  1664.  
  1665.                         ConfigChanged = FALSE;
  1666.                     }
  1667.                     else
  1668.                     {
  1669.                         Results[0] = RC_ERROR;
  1670.                         Results[1] = IoErr();
  1671.                     }
  1672.                 }
  1673.  
  1674.                 break;
  1675.  
  1676.                 case DATATYPE_PHONEBOOK:
  1677.                 {
  1678.                     if(ChosenEntry)
  1679.                     {
  1680.                         Results[0] = RC_ERROR;
  1681.                         Results[1] = ERROR_OBJECT_IN_USE;
  1682.                     }
  1683.                     else
  1684.                     {
  1685.                         if(!LoadPhonebook(FileName,NULL))
  1686.                         {
  1687.                             Results[0] = RC_ERROR;
  1688.                             Results[1] = IoErr();
  1689.                         }
  1690.                         else
  1691.                         {
  1692.                             strcpy(LastPhone,FileName);
  1693.                             strcpy(Config->PhonebookFileName,LastPhone);
  1694.  
  1695.                             PhonebookChanged = FALSE;
  1696.  
  1697.                             RebuildMenu = TRUE;
  1698.                         }
  1699.                     }
  1700.                 }
  1701.  
  1702.                 break;
  1703.             }
  1704.  
  1705.             ReleaseWindows();
  1706.         }
  1707.         else
  1708.             Results[0] = RC_WARN;
  1709.     }
  1710.  
  1711.     return(NULL);
  1712. }
  1713.  
  1714. STRPTR
  1715. RexxOpenDevice(struct RexxPkt *Pkt)
  1716. {
  1717.     enum    {    ARG_OPENDEVICE_NAME,ARG_OPENDEVICE_UNIT };
  1718.  
  1719.     if(ReadRequest)
  1720.     {
  1721.         Results[0] = RC_ERROR;
  1722.         Results[1] = TERMERROR_DEVICE_DRIVER_STILL_OPEN;
  1723.     }
  1724.     else
  1725.     {
  1726.         if(Args[ARG_OPENDEVICE_NAME])
  1727.         {
  1728.             strcpy(Config -> SerialConfig -> SerialDevice,Args[ARG_OPENDEVICE_NAME]);
  1729.  
  1730.             ConfigChanged = TRUE;
  1731.         }
  1732.  
  1733.         if(Args[ARG_OPENDEVICE_UNIT])
  1734.         {
  1735.             Config -> SerialConfig -> UnitNumber = *(LONG *)Args[ARG_OPENDEVICE_UNIT];
  1736.  
  1737.             ConfigChanged = TRUE;
  1738.         }
  1739.  
  1740.         BlockWindows();
  1741.  
  1742.         ReopenSerial();
  1743.  
  1744.         ReleaseWindows();
  1745.     }
  1746.  
  1747.     return(NULL);
  1748. }
  1749.  
  1750. STRPTR
  1751. RexxOpenRequester(struct RexxPkt *Pkt)
  1752. {
  1753.     enum    {    ARG_OPENREQUESTER_REQUESTER };
  1754.  
  1755.     LONG Index;
  1756.  
  1757.     if((Index = ToRequester(Args[ARG_OPENREQUESTER_REQUESTER])) == -1)
  1758.     {
  1759.         Results[0] = RC_ERROR;
  1760.         Results[1] = ERROR_OBJECT_NOT_FOUND;
  1761.     }
  1762.     else
  1763.     {
  1764.         ULONG    Code;
  1765.         LONG    i;
  1766.  
  1767.         switch(Index)
  1768.         {
  1769.             case REQUESTER_SERIAL:
  1770.  
  1771.                 Code = MEN_SERIAL;
  1772.                 break;
  1773.  
  1774.             case REQUESTER_MODEM:
  1775.  
  1776.                 Code = MEN_MODEM;
  1777.                 break;
  1778.  
  1779.             case REQUESTER_SCREEN:
  1780.  
  1781.                 Code = MEN_SCREEN;
  1782.                 break;
  1783.  
  1784.             case REQUESTER_TERMINAL:
  1785.  
  1786.                 Code = MEN_TERMINAL;
  1787.                 break;
  1788.  
  1789.             case REQUESTER_EMULATION:
  1790.  
  1791.                 Code = MEN_SET_EMULATION;
  1792.                 break;
  1793.  
  1794.             case REQUESTER_CLIPBOARD:
  1795.  
  1796.                 Code = MEN_CLIPBOARD;
  1797.                 break;
  1798.  
  1799.             case REQUESTER_CAPTURE:
  1800.  
  1801.                 Code = MEN_CAPTURE;
  1802.                 break;
  1803.  
  1804.             case REQUESTER_COMMANDS:
  1805.  
  1806.                 Code = MEN_COMMANDS;
  1807.                 break;
  1808.  
  1809.             case REQUESTER_MISC:
  1810.  
  1811.                 Code = MEN_MISC;
  1812.                 break;
  1813.  
  1814.             case REQUESTER_PATH:
  1815.  
  1816.                 Code = MEN_PATH;
  1817.                 break;
  1818.  
  1819.             case REQUESTER_TRANSFER:
  1820.  
  1821.                 Code = MEN_TRANSFER;
  1822.                 break;
  1823.  
  1824.             case REQUESTER_TRANSLATIONS:
  1825.  
  1826.                 Code = MEN_TRANSLATION;
  1827.                 break;
  1828.  
  1829.             case REQUESTER_FUNCTIONKEYS:
  1830.  
  1831.                 Code = MEN_MACROS;
  1832.                 break;
  1833.  
  1834.             case REQUESTER_CURSORKEYS:
  1835.  
  1836.                 Code = MEN_CURSORKEYS;
  1837.                 break;
  1838.  
  1839.             case REQUESTER_FASTMACROS:
  1840.  
  1841.                 Code = MEN_FAST_MACROS;
  1842.                 break;
  1843.  
  1844.             case REQUESTER_HOTKEYS:
  1845.  
  1846.                 Code = MEN_HOTKEYS;
  1847.                 break;
  1848.  
  1849.             case REQUESTER_SPEECH:
  1850.  
  1851.                 Code = MEN_SPEECH;
  1852.                 break;
  1853.  
  1854.             case REQUESTER_SOUND:
  1855.  
  1856.                 Code = MEN_SOUND;
  1857.                 break;
  1858.  
  1859.  
  1860.             case REQUESTER_PHONE:
  1861.  
  1862.                 Code = MEN_PHONEBOOK;
  1863.                 break;
  1864.         }
  1865.  
  1866.             /* Scan the menu list... */
  1867.  
  1868.         for(i = 0 ; TermMenu[i] . nm_Type != NM_END ; i++)
  1869.         {
  1870.                 /* Did we get a valid name string? */
  1871.  
  1872.             if(TermMenu[i] . nm_Label != NM_BARLABEL)
  1873.             {
  1874.                 if((ULONG)TermMenu[i] . nm_UserData == Code)
  1875.                 {
  1876.                     HandleMenuCode((ULONG)TermMenu[i] . nm_UserData,NULL);
  1877.  
  1878.                     break;
  1879.                 }
  1880.             }
  1881.         }
  1882.     }
  1883.  
  1884.     return(NULL);
  1885. }
  1886.  
  1887. STRPTR
  1888. RexxParity(struct RexxPkt *Pkt)
  1889. {
  1890.     enum    {    ARG_PARITY_EVEN,ARG_PARITY_ODD,ARG_PARITY_NONE,ARG_PARITY_MARK,ARG_PARITY_SPACE };
  1891.  
  1892.     LONG Mode;
  1893.  
  1894.     if(Args[ARG_PARITY_EVEN])
  1895.         Mode = PARITY_EVEN;
  1896.  
  1897.     if(Args[ARG_PARITY_ODD])
  1898.         Mode = PARITY_ODD;
  1899.  
  1900.     if(Args[ARG_PARITY_NONE])
  1901.         Mode = PARITY_NONE;
  1902.  
  1903.     if(Args[ARG_PARITY_MARK])
  1904.         Mode = PARITY_MARK;
  1905.  
  1906.     if(Args[ARG_PARITY_SPACE])
  1907.         Mode = PARITY_SPACE;
  1908.  
  1909.     if(Config -> SerialConfig -> Parity != Mode)
  1910.     {
  1911.         Config -> SerialConfig -> Parity = Mode;
  1912.  
  1913.         UpdateRequired = TRUE;
  1914.  
  1915.         ConfigChanged = TRUE;
  1916.     }
  1917.  
  1918.     return(NULL);
  1919. }
  1920.  
  1921. STRPTR
  1922. RexxPasteClip(struct RexxPkt *Pkt)
  1923. {
  1924.     enum    {    ARG_PASTECLIP_UNIT };
  1925.  
  1926.     struct DataMsg    *Msg;
  1927.     LONG         Unit;
  1928.  
  1929.     if(Args[ARG_PASTECLIP_UNIT])
  1930.         Unit = *(LONG *)Args[ARG_PASTECLIP_UNIT];
  1931.     else
  1932.         Unit = Config -> ClipConfig -> ClipboardUnit;
  1933.  
  1934.     if(Msg = (struct DataMsg *)CreateMsgItem(sizeof(struct DataMsg)))
  1935.     {
  1936.         Msg -> Type = DATAMSGTYPE_WRITECLIP;
  1937.         Msg -> Size = Unit;
  1938.  
  1939.         PutMsgItem(SpecialQueue,(struct MsgItem *)Msg);
  1940.     }
  1941.     else
  1942.     {
  1943.         Results[0] = RC_ERROR;
  1944.         Results[1] = ERROR_NO_FREE_STORE;
  1945.     }
  1946.  
  1947.     return(NULL);
  1948. }
  1949.  
  1950. STRPTR
  1951. RexxPrint(struct RexxPkt *Pkt)
  1952. {
  1953.     enum    {    ARG_PRINT_FROM,ARG_PRINT_TO,ARG_PRINT_SERIAL,ARG_PRINT_MODEM,ARG_PRINT_SCREEN,
  1954.             ARG_PRINT_TERMINAL,ARG_PRINT_USER,ARG_PRINT_COMMENT,ARG_PRINT_SIZE,
  1955.             ARG_PRINT_DATE,ARG_PRINT_BITS };
  1956.  
  1957.     LONG    Index,Mode = -1;
  1958.     ULONG    Flags = NULL;
  1959.  
  1960.     if(Args[ARG_PRINT_SERIAL])
  1961.         Flags |= PRINT_SERIAL;
  1962.  
  1963.     if(Args[ARG_PRINT_MODEM])
  1964.         Flags |= PRINT_MODEM;
  1965.  
  1966.     if(Args[ARG_PRINT_SCREEN])
  1967.         Flags |= PRINT_SCREEN;
  1968.  
  1969.     if(Args[ARG_PRINT_TERMINAL])
  1970.         Flags |= PRINT_TERMINAL;
  1971.  
  1972.     if(Args[ARG_PRINT_USER])
  1973.         Flags |= PRINT_USERNAME;
  1974.  
  1975.     if(Args[ARG_PRINT_COMMENT])
  1976.         Flags |= PRINT_COMMENT;
  1977.  
  1978.     if(Args[ARG_PRINT_SIZE])
  1979.         Flags |= PRINT_SIZE;
  1980.  
  1981.     if(Args[ARG_PRINT_DATE])
  1982.         Flags |= PRINT_DATE;
  1983.  
  1984.     if(Args[ARG_PRINT_BITS])
  1985.         Flags |= PRINT_BITS;
  1986.  
  1987.     if((Index = ToList(Args[ARG_PRINT_FROM])) == -1)
  1988.     {
  1989.         if(!Stricmp(Args[ARG_PRINT_FROM],"SCREENTEXT"))
  1990.         {
  1991.             if(!RasterEnabled)
  1992.             {
  1993.                 Results[0] = RC_ERROR;
  1994.                 Results[1] = TERMERROR_NO_DATA_TO_PROCESS;
  1995.  
  1996.                 return(NULL);
  1997.             }
  1998.             else
  1999.                 Mode = 0;
  2000.         }
  2001.  
  2002.         if(!Stricmp(Args[ARG_PRINT_FROM],"CLIPBOARD"))
  2003.             Mode = 1;
  2004.  
  2005.         if(!Stricmp(Args[ARG_PRINT_FROM],"BUFFER"))
  2006.             Mode = 2;
  2007.     }
  2008.  
  2009.     if(Index == -1 && Mode == -1)
  2010.     {
  2011.         Results[0] = RC_ERROR;
  2012.         Results[1] = TERMERROR_UNKNOWN_LIST;
  2013.     }
  2014.     else
  2015.     {
  2016.         BOOL    Continue = TRUE;
  2017.         LONG    Error = 0;
  2018.         BPTR    File;
  2019.         STRPTR    Name;
  2020.  
  2021.         if(Args[ARG_PRINT_TO])
  2022.             Name = Args[ARG_PRINT_TO];
  2023.         else
  2024.             Name = "PRT:";
  2025.  
  2026.         if(File = Open(Name,MODE_NEWFILE))
  2027.         {
  2028.             struct Window        *ReqWindow;
  2029.             struct EasyStruct     Easy;
  2030.  
  2031.             Easy . es_StructSize    = sizeof(struct EasyStruct);
  2032.             Easy . es_Flags        = NULL;
  2033.             Easy . es_Title        = (UBYTE *)LocaleString(MSG_TERMAUX_TERM_REQUEST_TXT);
  2034.             Easy . es_GadgetFormat    = (UBYTE *)LocaleString(MSG_PRINT_STOP_TXT);
  2035.             Easy . es_TextFormat    = (UBYTE *)LocaleString(MSG_GLOBAL_PRINTING_TXT);
  2036.  
  2037.             BlockWindows();
  2038.  
  2039.             if(ReqWindow = BuildEasyRequest(Window,&Easy,NULL))
  2040.             {
  2041.                 switch(Index)
  2042.                 {
  2043.                     case GLIST_DIAL:
  2044.                     {
  2045.                         struct GenericList *List = GenericListTable[Index];
  2046.  
  2047.                         ObtainSemaphore(&List -> ListSemaphore);
  2048.  
  2049.                         if(List -> ListHeader . mlh_Head -> mln_Succ)
  2050.                         {
  2051.                             struct DialNode *TempNode;
  2052.  
  2053.                             for(TempNode = (struct DialNode *)List -> ListHeader . mlh_Head ; Continue && TempNode -> Node . ln_Succ ; TempNode = (struct DialNode *)TempNode -> Node . ln_Succ)
  2054.                             {
  2055.                                 if(TempNode -> Entry)
  2056.                                     Continue = PrintEntry(File,ReqWindow,TRUE,&Error,TempNode -> Entry,Flags);
  2057.                                 else
  2058.                                     Continue = PrintText(File,ReqWindow,&Error,"\n\"???\" (%s)",TempNode -> Node . ln_Name);
  2059.                             }
  2060.                         }
  2061.  
  2062.                         ReleaseSemaphore(&List -> ListSemaphore);
  2063.                     }
  2064.  
  2065.                     break;
  2066.  
  2067.                     case GLIST_UPLOAD:
  2068.                     case GLIST_DOWNLOAD:
  2069.                     {
  2070.                         struct GenericList *List = GenericListTable[Index];
  2071.  
  2072.                         ObtainSemaphore(&List -> ListSemaphore);
  2073.  
  2074.                         if(List -> ListHeader . mlh_Head -> mln_Succ)
  2075.                         {
  2076.                             struct Node *TempNode;
  2077.  
  2078.                             for(TempNode = (struct Node *)List -> ListHeader . mlh_Head ; Continue && TempNode -> ln_Succ ; TempNode = TempNode -> ln_Succ)
  2079.                                 Continue = PrintFileInformation(File,ReqWindow,&Error,TempNode -> ln_Name,Flags);
  2080.                         }
  2081.  
  2082.                         ReleaseSemaphore(&List -> ListSemaphore);
  2083.                     }
  2084.  
  2085.                     break;
  2086.  
  2087.                     case GLIST_WAIT:
  2088.                     {
  2089.                         struct GenericList *List = GenericListTable[Index];
  2090.  
  2091.                         ObtainSemaphore(&List -> ListSemaphore);
  2092.  
  2093.                         if(List -> ListHeader . mlh_Head -> mln_Succ)
  2094.                         {
  2095.                             struct Node *TempNode;
  2096.  
  2097.                             for(TempNode = (struct Node *)List -> ListHeader . mlh_Head ; Continue && TempNode -> ln_Succ ; TempNode = TempNode -> ln_Succ)
  2098.                                 Continue = PrintText(File,ReqWindow,&Error,"%s\n",TempNode -> ln_Name);
  2099.                         }
  2100.  
  2101.                         ReleaseSemaphore(&List -> ListSemaphore);
  2102.                     }
  2103.  
  2104.                     break;
  2105.  
  2106.                     default:
  2107.                     {
  2108.                         switch(Mode)
  2109.                         {
  2110.                             case 0:
  2111.  
  2112.                                 Continue = PrintScreen(File,ReqWindow,&Error);
  2113.                                 break;
  2114.  
  2115.                             case 1:
  2116.  
  2117.                                 Continue = PrintClip(File,ReqWindow,&Error);
  2118.                                 break;
  2119.  
  2120.                             case 2:
  2121.  
  2122.                                 Continue = PrintBuffer(File,ReqWindow,&Error);
  2123.                                 break;
  2124.                         }
  2125.  
  2126.                         break;
  2127.                     }
  2128.  
  2129.                     break;
  2130.                 }
  2131.  
  2132.                 FreeSysRequest(ReqWindow);
  2133.             }
  2134.  
  2135.             ReleaseWindows();
  2136.  
  2137.             Close(File);
  2138.         }
  2139.         else
  2140.             Error = IoErr();
  2141.  
  2142.         if(Error)
  2143.         {
  2144.             Results[0] = RC_ERROR;
  2145.             Results[1] = Error;
  2146.         }
  2147.         else
  2148.         {
  2149.             if(!Continue)
  2150.                 Results[0] = RC_WARN;
  2151.         }
  2152.     }
  2153.  
  2154.     return(NULL);
  2155. }
  2156.  
  2157. STRPTR
  2158. RexxProcessIO(struct RexxPkt *Pkt)
  2159. {
  2160.     enum    {    ARG_PROCESSIO_ON,ARG_PROCESSIO_OFF };
  2161.  
  2162.     Forbid();
  2163.  
  2164.     if(Args[ARG_PROCESSIO_ON])
  2165.         ProcessIO = TRUE;
  2166.  
  2167.     if(Args[ARG_PROCESSIO_OFF])
  2168.         ProcessIO = FALSE;
  2169.  
  2170.     Permit();
  2171.  
  2172.     return(NULL);
  2173. }
  2174.  
  2175. STRPTR
  2176. RexxProtocol(struct RexxPkt *Pkt)
  2177. {
  2178.     enum    {    ARG_PROTOCOL_NONE,ARG_PROTOCOL_RTSCTS,ARG_PROTOCOL_RTSCTSDTR };
  2179.  
  2180.     LONG Mode;
  2181.  
  2182.     if(Args[ARG_PROTOCOL_NONE])
  2183.         Mode = HANDSHAKING_NONE;
  2184.  
  2185.     if(Args[ARG_PROTOCOL_RTSCTS])
  2186.         Mode = HANDSHAKING_RTSCTS;
  2187.  
  2188.     if(Args[ARG_PROTOCOL_RTSCTSDTR])
  2189.         Mode = HANDSHAKING_RTSCTS_DSR;
  2190.  
  2191.     if(Config -> SerialConfig -> HandshakingProtocol != Mode)
  2192.     {
  2193.         Config -> SerialConfig -> HandshakingProtocol = Mode;
  2194.  
  2195.         UpdateRequired = TRUE;
  2196.  
  2197.         ConfigChanged = TRUE;
  2198.     }
  2199.  
  2200.     return(NULL);
  2201. }
  2202.  
  2203. STRPTR
  2204. RexxPutClip(struct RexxPkt *Pkt)
  2205. {
  2206.     enum    {    ARG_PUTCLIP_UNIT,ARG_PUTCLIP_TEXT };
  2207.  
  2208.     struct IFFHandle    *Handle;
  2209.     LONG             Unit;
  2210.     BOOL             Success = FALSE;
  2211.  
  2212.     if(Args[ARG_PUTCLIP_UNIT])
  2213.         Unit = *(LONG *)Args[ARG_PUTCLIP_UNIT];
  2214.     else
  2215.         Unit = Config -> ClipConfig -> ClipboardUnit;
  2216.  
  2217.     if(Handle = AllocIFF())
  2218.     {
  2219.         if(Handle -> iff_Stream = (ULONG)OpenClipboard(Unit))
  2220.         {
  2221.             InitIFFasClip(Handle);
  2222.  
  2223.             if(!OpenIFF(Handle,IFFF_WRITE))
  2224.             {
  2225.                 if(!PushChunk(Handle,ID_FTXT,ID_FORM,IFFSIZE_UNKNOWN))
  2226.                 {
  2227.                     if(!PushChunk(Handle,0,ID_CHRS,IFFSIZE_UNKNOWN))
  2228.                     {
  2229.                         LONG Len = strlen(Args[ARG_PUTCLIP_TEXT]);
  2230.  
  2231.                         if(WriteChunkBytes(Handle,Args[ARG_PUTCLIP_TEXT],Len) == Len)
  2232.                         {
  2233.                             if(!PopChunk(Handle))
  2234.                                 Success = TRUE;
  2235.                         }
  2236.                     }
  2237.                 }
  2238.  
  2239.                 if(PopChunk(Handle))
  2240.                     Success = FALSE;
  2241.  
  2242.                 CloseIFF(Handle);
  2243.             }
  2244.             else
  2245.             {
  2246.                 Results[0] = RC_ERROR;
  2247.                 Results[1] = ERROR_NO_FREE_STORE;
  2248.             }
  2249.  
  2250.             CloseClipboard((struct ClipboardHandle *)Handle -> iff_Stream);
  2251.         }
  2252.         else
  2253.         {
  2254.             Results[0] = RC_ERROR;
  2255.             Results[1] = TERMERROR_UNIT_NOT_AVAILABLE;
  2256.         }
  2257.  
  2258.         FreeIFF(Handle);
  2259.     }
  2260.     else
  2261.     {
  2262.         Results[0] = RC_ERROR;
  2263.         Results[1] = ERROR_NO_FREE_STORE;
  2264.     }
  2265.  
  2266.     if(!Success && !Results[0])
  2267.     {
  2268.         Results[0] = RC_ERROR;
  2269.         Results[1] = TERMERROR_CLIPBOARD_ERROR;
  2270.     }
  2271.  
  2272.     return(NULL);
  2273. }
  2274.  
  2275. STRPTR
  2276. RexxQuit(struct RexxPkt *Pkt)
  2277. {
  2278.     enum    {    ARG_QUIT_FORCE };
  2279.  
  2280.     struct DataMsg *Msg;
  2281.  
  2282.     if(Msg = (struct DataMsg *)CreateMsgItem(sizeof(struct DataMsg)))
  2283.     {
  2284.         Pkt -> RexxMsg -> rm_Result1 = RC_WARN;
  2285.         Pkt -> RexxMsg -> rm_Result2 = 0;
  2286.  
  2287.         ReplyMsg(Pkt -> RexxMsg);
  2288.  
  2289.         Pkt -> RexxMsg = NULL;
  2290.  
  2291.         Msg -> Type = DATAMSGTYPE_MENU;
  2292.         Msg -> Size = MEN_QUIT;
  2293.  
  2294.         if(Args[ARG_QUIT_FORCE])
  2295.             Msg -> Data = (APTR)(IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT);
  2296.         else
  2297.             Msg -> Data = NULL;
  2298.  
  2299.         PutMsgItem(SpecialQueue,(struct MsgItem *)Msg);
  2300.     }
  2301.     else
  2302.     {
  2303.         Results[0] = RC_ERROR;
  2304.         Results[1] = ERROR_NO_FREE_STORE;
  2305.     }
  2306.  
  2307.     return(NULL);
  2308. }
  2309.  
  2310. STATIC STRPTR    RexxReadBuffer;
  2311. STATIC LONG    RexxReadIndex,
  2312.         RexxReadLen;
  2313. STATIC BOOLEAN    RexxReadDone,
  2314.         RexxReadEcho;
  2315.  
  2316. STATIC BOOL
  2317. RexxReadBypassVerbatim(STRPTR Buffer,LONG Size)
  2318. {
  2319.     while(Size-- > 0)
  2320.     {
  2321.         switch(*Buffer)
  2322.         {
  2323.             case '\n':
  2324.  
  2325.                 break;
  2326.  
  2327.             case '\r':
  2328.  
  2329.                 RexxReadDone = TRUE;
  2330.                 break;
  2331.  
  2332.             case '\b':
  2333.             case '\30':
  2334.  
  2335.                 while(RexxReadIndex > 0)
  2336.                 {
  2337.                     if(RexxReadEcho)
  2338.                         SerWriteVerbatim("\b",1,FALSE);
  2339.  
  2340.                     RexxReadIndex--;
  2341.                 }
  2342.  
  2343.                 break;
  2344.  
  2345.             default:
  2346.  
  2347.                 if(RexxReadIndex < RexxReadLen && ((*Buffer >= ' ' && *Buffer < 127) || *Buffer >= 160 || Config -> TerminalConfig -> FontMode == FONT_IBM))
  2348.                 {
  2349.                     RexxReadBuffer[RexxReadIndex++] = *Buffer;
  2350.  
  2351.                     if(RexxReadEcho)
  2352.                         SerWriteVerbatim(Buffer,1,FALSE);
  2353.                 }
  2354.  
  2355.                 break;
  2356.         }
  2357.  
  2358.         Buffer++;
  2359.     }
  2360.  
  2361.     return(FALSE);
  2362. }
  2363.  
  2364. STATIC BOOL
  2365. RexxReadBypassTranslate(STRPTR Buffer,LONG Size)
  2366. {
  2367.     struct TranslationHandle    Handle;
  2368.     UBYTE                Temp;
  2369.  
  2370.     while(Size-- > 0)
  2371.     {
  2372.         TranslateSetup(&Handle,Buffer,1,&Temp,1,ReceiveTable);
  2373.  
  2374.         while(!RexxReadDone && TranslateBuffer(&Handle))
  2375.         {
  2376.             switch(Temp)
  2377.             {
  2378.                 case '\n':
  2379.  
  2380.                     break;
  2381.  
  2382.                 case '\r':
  2383.  
  2384.                     RexxReadDone = TRUE;
  2385.  
  2386.                     break;
  2387.  
  2388.                 case '\b':
  2389.                 case '\30':
  2390.  
  2391.                     while(RexxReadIndex > 0)
  2392.                     {
  2393.                         if(RexxReadEcho)
  2394.                             SerWriteVerbatim("\b",1,FALSE);
  2395.  
  2396.                         RexxReadIndex--;
  2397.                     }
  2398.  
  2399.                     break;
  2400.  
  2401.                 default:
  2402.  
  2403.                     if(RexxReadIndex < RexxReadLen && ((Temp >= ' ' && Temp < 127) || Temp >= 160 || Config -> TerminalConfig -> FontMode == FONT_IBM))
  2404.                     {
  2405.                         RexxReadBuffer[RexxReadIndex++] = Temp;
  2406.  
  2407.                         if(RexxReadEcho)
  2408.                             SerWriteVerbatim(&Temp,1,FALSE);
  2409.                     }
  2410.  
  2411.                     break;
  2412.             }
  2413.         }
  2414.  
  2415.         Buffer++;
  2416.     }
  2417.  
  2418.     return(FALSE);
  2419. }
  2420.  
  2421. STRPTR
  2422. RexxRead(struct RexxPkt *Pkt)
  2423. {
  2424.     enum    {    ARG_READ_NUM,ARG_READ_CR,ARG_READ_NOECHO,ARG_READ_VERBATIM,ARG_READ_PROMPT };
  2425.  
  2426.     LONG Len,BytesRead = 0;
  2427.  
  2428.     if(!ReadRequest || !WriteRequest)
  2429.     {
  2430.         Results[0] = RC_WARN;
  2431.  
  2432.         return(NULL);
  2433.     }
  2434.  
  2435.     if(Args[ARG_READ_NUM])
  2436.     {
  2437.         Len = *(LONG *)Args[ARG_READ_NUM] + 1;
  2438.  
  2439.         if(Len < 1)
  2440.         {
  2441.             Results[0] = RC_ERROR;
  2442.             Results[1] = ERROR_BAD_NUMBER;
  2443.  
  2444.             return(NULL);
  2445.         }
  2446.  
  2447.         if(Len > MAX_RESULT_LEN + 1)
  2448.             Len = MAX_RESULT_LEN + 1;
  2449.     }
  2450.     else
  2451.         Len = MAX_RESULT_LEN + 1;
  2452.  
  2453.     if(Args[ARG_READ_PROMPT])
  2454.         SerialCommand(Args[ARG_READ_PROMPT]);
  2455.  
  2456.     if(Marking)
  2457.         DropMarker();
  2458.  
  2459.     BlockWindows();
  2460.  
  2461.     if(Args[ARG_READ_CR])
  2462.     {
  2463.         Forbid();
  2464.  
  2465.         LT_UnlockWindow(Window);
  2466.  
  2467.         Window -> Flags |= WFLG_RMBTRAP;
  2468.  
  2469.         Permit();
  2470.  
  2471.         NormalCursor();
  2472.     }
  2473.  
  2474.     Status = STATUS_READY;
  2475.  
  2476.     if(Args[ARG_READ_VERBATIM] || !ReceiveTable)
  2477.     {
  2478.         if(Args[ARG_READ_CR])
  2479.         {
  2480.             ULONG     Signals,SignalMask = SIG_SERIAL | SIG_TIMER | SIG_BREAK;
  2481.             UBYTE    *Char;
  2482.             BOOL     Echo,Done = FALSE;
  2483.             LONG     Index = 0;
  2484.             STRPTR     Buffer;
  2485.  
  2486.             if(Buffer = (STRPTR)AllocVecPooled(Len,MEMF_ANY))
  2487.             {
  2488.                 if(Args[ARG_READ_NOECHO])
  2489.                     Echo = FALSE;
  2490.                 else
  2491.                     Echo = TRUE;
  2492.  
  2493.                 RexxReadEcho = Echo;
  2494.  
  2495.                 if(RexxTimeoutVal)
  2496.                     StartTime(RexxTimeoutVal,0);
  2497.  
  2498.                 if(DataHold)
  2499.                 {
  2500.                     while(DataSize-- > 0)
  2501.                     {
  2502.                         Char = DataHold++;
  2503.  
  2504.                         switch(*Char)
  2505.                         {
  2506.                             case '\n':
  2507.  
  2508.                                 break;
  2509.  
  2510.                             case '\r':
  2511.  
  2512.                                 Done = TRUE;
  2513.  
  2514.                                 if(Echo)
  2515.                                     SerWrite(ReadBuffer,1);
  2516.  
  2517.                                 break;
  2518.  
  2519.                             case '\b':
  2520.  
  2521.                                 if(Index > 0)
  2522.                                 {
  2523.                                     Index--;
  2524.  
  2525.                                     if(Echo)
  2526.                                         SerWrite(ReadBuffer,1);
  2527.                                 }
  2528.  
  2529.                                 break;
  2530.  
  2531.                             case '\30':
  2532.  
  2533.                                 if(Echo)
  2534.                                 {
  2535.                                     while(Index > 0)
  2536.                                     {
  2537.                                         Index--;
  2538.  
  2539.                                         SerWrite("\b",1);
  2540.                                     }
  2541.                                 }
  2542.                                 else
  2543.                                     Index = 0;
  2544.  
  2545.                                 break;
  2546.  
  2547.                             default:
  2548.  
  2549.                                 if(Index < Len && ((*Char >= ' ' && *Char < 127) || *Char >= 160 || Config -> TerminalConfig -> FontMode == FONT_IBM))
  2550.                                 {
  2551.                                     Buffer[Index++] = *Char;
  2552.  
  2553.                                     if(Echo)
  2554.                                         SerWrite(ReadBuffer,1);
  2555.                                 }
  2556.  
  2557.                                 break;
  2558.                         }
  2559.                     }
  2560.  
  2561.                     DataHold = NULL;
  2562.  
  2563.                     RestartSerial();
  2564.                 }
  2565.  
  2566.                 if(CheckSerialRead())
  2567.                     Signals = SIG_SERIAL;
  2568.                 else
  2569.                     Signals = NULL;
  2570.  
  2571.                 do
  2572.                 {
  2573.                     if(Signals & SIG_WINDOW)
  2574.                     {
  2575.                         SerWriteBypass = RexxReadBypassVerbatim;
  2576.  
  2577.                         RexxReadBuffer    = Buffer;
  2578.                         RexxReadIndex    = Index;
  2579.                         RexxReadLen    = Len;
  2580.                         RexxReadDone    = Done;
  2581.  
  2582.                         while(HandleWindow());
  2583.  
  2584.                         Buffer    = RexxReadBuffer;
  2585.                         Index    = RexxReadIndex;
  2586.                         Len    = RexxReadLen;
  2587.                         Done    = RexxReadDone;
  2588.  
  2589.                         SerWriteBypass = NULL;
  2590.                     }
  2591.  
  2592.                     if(Signals & SIG_SERIAL)
  2593.                     {
  2594.                         if(!WaitSerialRead())
  2595.                         {
  2596.                             LONG Length;
  2597.  
  2598.                             BytesIn++;
  2599.  
  2600.                             if(Translate_CR_LF)
  2601.                                 Length = (* Translate_CR_LF)(ReadBuffer,1);
  2602.                             else
  2603.                                 Length = 1;
  2604.  
  2605.                             Char = ReadBuffer;
  2606.  
  2607.                             while(Length--)
  2608.                             {
  2609.                                 switch(*Char)
  2610.                                 {
  2611.                                     case '\n':
  2612.  
  2613.                                         break;
  2614.  
  2615.                                     case '\r':
  2616.  
  2617.                                         Done = TRUE;
  2618.  
  2619.                                         if(Echo)
  2620.                                             SerWrite(ReadBuffer,1);
  2621.  
  2622.                                         break;
  2623.  
  2624.                                     case '\b':
  2625.  
  2626.                                         if(Index > 0)
  2627.                                         {
  2628.                                             Index--;
  2629.  
  2630.                                             if(Echo)
  2631.                                                 SerWrite(ReadBuffer,1);
  2632.                                         }
  2633.  
  2634.                                         break;
  2635.  
  2636.                                     case '\30':
  2637.  
  2638.                                         if(Echo)
  2639.                                         {
  2640.                                             while(Index > 0)
  2641.                                             {
  2642.                                                 Index--;
  2643.  
  2644.                                                 SerWrite("\b",1);
  2645.                                             }
  2646.                                         }
  2647.                                         else
  2648.                                             Index = 0;
  2649.  
  2650.                                     default:
  2651.  
  2652.                                         if(Index < Len && ((*Char >= ' ' && *Char < 127) || *Char >= 160 || Config -> TerminalConfig -> FontMode == FONT_IBM))
  2653.                                         {
  2654.                                             Buffer[Index++] = *Char;
  2655.  
  2656.                                             if(Echo)
  2657.                                                 SerWrite(ReadBuffer,1);
  2658.                                         }
  2659.  
  2660.                                         break;
  2661.                                 }
  2662.  
  2663.                                 Char++;
  2664.                             }
  2665.                         }
  2666.  
  2667.                         RestartSerial();
  2668.                     }
  2669.  
  2670.                     if(Signals & (SIG_BREAK | SIG_TIMER))
  2671.                     {
  2672.                         Results[0] = RC_WARN;
  2673.  
  2674.                         break;
  2675.                     }
  2676.  
  2677.                     if(!Done)
  2678.                         Signals = Wait(SignalMask | SIG_WINDOW);
  2679.                 }
  2680.                 while(!Done);
  2681.  
  2682.                 if(RexxTimeoutVal)
  2683.                     StopTime();
  2684.  
  2685.                 if(Index)
  2686.                 {
  2687.                     STRPTR Result;
  2688.  
  2689.                     Buffer[Index] = 0;
  2690.  
  2691.                     Result = CreateResult(Buffer,Results);
  2692.  
  2693.                     if(Args[ARG_READ_CR])
  2694.                     {
  2695.                         Forbid();
  2696.  
  2697.                         Window -> Flags &= ~WFLG_RMBTRAP;
  2698.  
  2699.                         LT_LockWindow(Window);
  2700.  
  2701.                         Permit();
  2702.                     }
  2703.  
  2704.                     ReleaseWindows();
  2705.  
  2706.                     FreeVecPooled(Buffer);
  2707.  
  2708.                     return(Result);
  2709.                 }
  2710.                 else
  2711.                     Results[0] = RC_WARN;
  2712.  
  2713.                 FreeVecPooled(Buffer);
  2714.             }
  2715.             else
  2716.             {
  2717.                 Results[0] = RC_ERROR;
  2718.                 Results[1] = ERROR_NO_FREE_STORE;
  2719.             }
  2720.         }
  2721.         else
  2722.         {
  2723.             STRPTR Buffer;
  2724.  
  2725.             if(Buffer = (STRPTR)AllocVecPooled(Len,MEMF_ANY))
  2726.             {
  2727.                 STRPTR Result;
  2728.  
  2729.                 if(DataHold && DataSize >= Len - 1)
  2730.                 {
  2731.                     CopyMem(DataHold,Buffer,Len - 1);
  2732.  
  2733.                     BytesRead = Len - 1;
  2734.  
  2735.                     if(DataSize == Len - 1)
  2736.                     {
  2737.                         DataHold = NULL;
  2738.  
  2739.                         RestartSerial();
  2740.                     }
  2741.                     else
  2742.                     {
  2743.                         DataHold += Len - 1;
  2744.                         DataSize -= Len - 1;
  2745.                     }
  2746.                 }
  2747.                 else
  2748.                 {
  2749.                     ULONG Signals,SignalMask = SIG_SERIAL | SIG_TIMER | SIG_BREAK;
  2750.  
  2751.                     ClearSerial();
  2752.  
  2753.                     ClrSignal(SignalMask);
  2754.  
  2755.                     if(RexxTimeoutVal)
  2756.                         StartTime(RexxTimeoutVal,0);
  2757.  
  2758.                     if(DataHold)
  2759.                     {
  2760.                         CopyMem(DataHold,Buffer,DataSize);
  2761.  
  2762.                         StartSerialRead(Buffer + DataSize,Len - 1 - DataSize);
  2763.  
  2764.                         BytesRead = DataSize;
  2765.  
  2766.                         DataHold = NULL;
  2767.                     }
  2768.                     else
  2769.                         StartSerialRead(Buffer,Len - 1);
  2770.  
  2771.                     FOREVER
  2772.                     {
  2773.                         Signals = Wait(SignalMask);
  2774.  
  2775.                         if(Signals & SIG_SERIAL)
  2776.                         {
  2777.                             if(RexxTimeoutVal)
  2778.                                 StopTime();
  2779.  
  2780.                                 /* Did the request terminate gracefully? */
  2781.  
  2782.                             if(!WaitSerialRead())
  2783.                             {
  2784.                                 BytesIn += ReadRequest -> IOSer . io_Actual;
  2785.  
  2786.                                 BytesRead = ReadRequest -> IOSer . io_Actual;
  2787.                             }
  2788.                             else
  2789.                                 Results[0] = RC_ERROR;
  2790.  
  2791.                             break;
  2792.                         }
  2793.  
  2794.                         if(Signals & SIG_BREAK)
  2795.                         {
  2796.                             StopSerialRead();
  2797.  
  2798.                             if(RexxTimeoutVal)
  2799.                                 StopTime();
  2800.  
  2801.                             Results[0] = RC_WARN;
  2802.  
  2803.                             break;
  2804.                         }
  2805.  
  2806.                         if(Signals & SIG_TIMER)
  2807.                         {
  2808.                             StopSerialRead();
  2809.  
  2810.                             WaitTime();
  2811.  
  2812.                             if(ReadRequest -> IOSer . io_Actual)
  2813.                             {
  2814.                                 BytesIn += ReadRequest -> IOSer . io_Actual;
  2815.  
  2816.                                 BytesRead = ReadRequest -> IOSer . io_Actual;
  2817.                             }
  2818.                             else
  2819.                             {
  2820.                                 ULONG Waiting = GetSerialWaiting();
  2821.  
  2822.                                 if(Waiting)
  2823.                                 {
  2824.                                         /* Don't read more than actually wanted. */
  2825.  
  2826.                                     if(!DoSerialRead(Buffer,MIN(Len - 1,Waiting)))
  2827.                                     {
  2828.                                         BytesIn += ReadRequest -> IOSer . io_Actual;
  2829.  
  2830.                                         BytesRead = ReadRequest -> IOSer . io_Actual;
  2831.                                     }
  2832.                                 }
  2833.                             }
  2834.  
  2835.                             break;
  2836.                         }
  2837.                     }
  2838.                 }
  2839.  
  2840.                 if(BytesRead)
  2841.                     Result = CreateResultLen(Buffer,Results,BytesRead);
  2842.                 else
  2843.                 {
  2844.                     Results[0] = RC_WARN;
  2845.  
  2846.                     Result = NULL;
  2847.                 }
  2848.  
  2849.                 FreeVecPooled(Buffer);
  2850.  
  2851.                 RestartSerial();
  2852.  
  2853.                 if(Args[ARG_READ_CR])
  2854.                 {
  2855.                     Forbid();
  2856.  
  2857.                     Window -> Flags &= ~WFLG_RMBTRAP;
  2858.  
  2859.                     LT_LockWindow(Window);
  2860.  
  2861.                     Permit();
  2862.                 }
  2863.  
  2864.                 ReleaseWindows();
  2865.  
  2866.                 return(Result);
  2867.             }
  2868.             else
  2869.             {
  2870.                 Results[0] = RC_ERROR;
  2871.                 Results[1] = ERROR_NO_FREE_STORE;
  2872.             }
  2873.  
  2874.             RestartSerial();
  2875.         }
  2876.     }
  2877.     else
  2878.     {
  2879.         if(Args[ARG_READ_CR])
  2880.         {
  2881.             ULONG                 Signals,SignalMask = SIG_SERIAL | SIG_TIMER | SIG_BREAK;
  2882.             UBYTE                *Char,Temp;
  2883.             BOOL                 Echo,Done = FALSE;
  2884.             LONG                 Index = 0;
  2885.             struct TranslationHandle     Handle;
  2886.             STRPTR                 Buffer;
  2887.  
  2888.             if(Buffer = (STRPTR)AllocVecPooled(Len,MEMF_ANY))
  2889.             {
  2890.                 if(Args[ARG_READ_NOECHO])
  2891.                     Echo = FALSE;
  2892.                 else
  2893.                     Echo = TRUE;
  2894.  
  2895.                 RexxReadEcho = Echo;
  2896.  
  2897.                 if(RexxTimeoutVal)
  2898.                     StartTime(RexxTimeoutVal,0);
  2899.  
  2900.                 if(DataHold)
  2901.                 {
  2902.                     while(DataSize-- > 0)
  2903.                     {
  2904.                         Char = DataHold++;
  2905.  
  2906.                         TranslateSetup(&Handle,Char,1,&Temp,1,ReceiveTable);
  2907.  
  2908.                         while(!Done && TranslateBuffer(&Handle))
  2909.                         {
  2910.                             switch(Temp)
  2911.                             {
  2912.                                 case '\n':
  2913.  
  2914.                                     break;
  2915.  
  2916.                                 case '\r':
  2917.  
  2918.                                     Done = TRUE;
  2919.  
  2920.                                     if(Echo)
  2921.                                         SerWrite(&Temp,1);
  2922.  
  2923.                                     break;
  2924.  
  2925.                                 case '\b':
  2926.  
  2927.                                     if(Index > 0)
  2928.                                     {
  2929.                                         Index--;
  2930.  
  2931.                                         if(Echo)
  2932.                                             SerWrite(&Temp,1);
  2933.                                     }
  2934.  
  2935.                                     break;
  2936.  
  2937.                                 case '\30':
  2938.  
  2939.                                     if(Echo)
  2940.                                     {
  2941.                                         while(Index > 0)
  2942.                                         {
  2943.                                             Index--;
  2944.  
  2945.                                             SerWrite("\b",1);
  2946.                                         }
  2947.                                     }
  2948.                                     else
  2949.                                         Index = 0;
  2950.  
  2951.                                     break;
  2952.  
  2953.                                 default:
  2954.  
  2955.                                     if(Index < Len && ((Temp >= ' ' && Temp < 127) || Temp >= 160 || Config -> TerminalConfig -> FontMode == FONT_IBM))
  2956.                                     {
  2957.                                         Buffer[Index++] = Temp;
  2958.  
  2959.                                         if(Echo)
  2960.                                             SerWrite(&Temp,1);
  2961.                                     }
  2962.  
  2963.                                     break;
  2964.                             }
  2965.                         }
  2966.                     }
  2967.  
  2968.                     DataHold = NULL;
  2969.  
  2970.                     RestartSerial();
  2971.                 }
  2972.  
  2973.                 if(CheckSerialRead())
  2974.                     Signals = SIG_SERIAL;
  2975.                 else
  2976.                     Signals = NULL;
  2977.  
  2978.                 do
  2979.                 {
  2980.                     if(Signals & SIG_WINDOW)
  2981.                     {
  2982.                         SerWriteBypass = RexxReadBypassTranslate;
  2983.  
  2984.                         RexxReadBuffer    = Buffer;
  2985.                         RexxReadIndex    = Index;
  2986.                         RexxReadLen    = Len;
  2987.                         RexxReadDone    = Done;
  2988.  
  2989.                         while(HandleWindow());
  2990.  
  2991.                         Buffer    = RexxReadBuffer;
  2992.                         Index    = RexxReadIndex;
  2993.                         Len    = RexxReadLen;
  2994.                         Done    = RexxReadDone;
  2995.  
  2996.                         SerWriteBypass = NULL;
  2997.                     }
  2998.  
  2999.                     if(Signals & SIG_SERIAL)
  3000.                     {
  3001.                         if(!WaitSerialRead())
  3002.                         {
  3003.                             LONG Length;
  3004.  
  3005.                             BytesIn++;
  3006.  
  3007.                             if(Translate_CR_LF)
  3008.                                 Length = (* Translate_CR_LF)(ReadBuffer,1);
  3009.                             else
  3010.                                 Length = 1;
  3011.  
  3012.                             if(Length)
  3013.                             {
  3014.                                 TranslateSetup(&Handle,ReadBuffer,Length,&Temp,1,ReceiveTable);
  3015.  
  3016.                                 while(!Done && TranslateBuffer(&Handle))
  3017.                                 {
  3018.                                     switch(Temp)
  3019.                                     {
  3020.                                         case '\n':
  3021.  
  3022.                                             break;
  3023.  
  3024.                                         case '\r':
  3025.  
  3026.                                             Done = TRUE;
  3027.  
  3028.                                             if(Echo)
  3029.                                                 SerWrite(&Temp,1);
  3030.  
  3031.                                             break;
  3032.  
  3033.                                         case '\b':
  3034.  
  3035.                                             if(Index > 0)
  3036.                                             {
  3037.                                                 Index--;
  3038.  
  3039.                                                 if(Echo)
  3040.                                                     SerWrite(&Temp,1);
  3041.                                             }
  3042.  
  3043.                                             break;
  3044.  
  3045.                                         case '\30':
  3046.  
  3047.                                             if(Echo)
  3048.                                             {
  3049.                                                 while(Index > 0)
  3050.                                                 {
  3051.                                                     Index--;
  3052.  
  3053.                                                     SerWrite("\b",1);
  3054.                                                 }
  3055.                                             }
  3056.                                             else
  3057.                                                 Index = 0;
  3058.  
  3059.                                         default:
  3060.  
  3061.                                             if(Index < Len && ((Temp >= ' ' && Temp < 127) || Temp >= 160 || Config -> TerminalConfig -> FontMode == FONT_IBM))
  3062.                                             {
  3063.                                                 Buffer[Index++] = Temp;
  3064.  
  3065.                                                 if(Echo)
  3066.                                                     SerWrite(&Temp,1);
  3067.                                             }
  3068.  
  3069.                                             break;
  3070.                                     }
  3071.                                 }
  3072.                             }
  3073.                         }
  3074.  
  3075.                         RestartSerial();
  3076.                     }
  3077.  
  3078.                     if(Signals & (SIG_BREAK | SIG_TIMER))
  3079.                     {
  3080.                         Results[0] = RC_WARN;
  3081.  
  3082.                         break;
  3083.                     }
  3084.  
  3085.                     if(!Done)
  3086.                         Signals = Wait(SignalMask | SIG_WINDOW);
  3087.                 }
  3088.                 while(!Done);
  3089.  
  3090.                 if(RexxTimeoutVal)
  3091.                     StopTime();
  3092.  
  3093.                 if(Index)
  3094.                 {
  3095.                     STRPTR Result;
  3096.  
  3097.                     Buffer[Index] = 0;
  3098.  
  3099.                     Result = CreateResult(Buffer,Results);
  3100.  
  3101.                     if(Args[ARG_READ_CR])
  3102.                     {
  3103.                         Forbid();
  3104.  
  3105.                         Window -> Flags &= ~WFLG_RMBTRAP;
  3106.  
  3107.                         LT_LockWindow(Window);
  3108.  
  3109.                         Permit();
  3110.                     }
  3111.  
  3112.                     ReleaseWindows();
  3113.  
  3114.                     FreeVecPooled(Buffer);
  3115.  
  3116.                     return(Result);
  3117.                 }
  3118.                 else
  3119.                     Results[0] = RC_WARN;
  3120.  
  3121.                 FreeVecPooled(Buffer);
  3122.             }
  3123.             else
  3124.             {
  3125.                 Results[0] = RC_ERROR;
  3126.                 Results[1] = ERROR_NO_FREE_STORE;
  3127.             }
  3128.         }
  3129.         else
  3130.         {
  3131.             STRPTR Buffer;
  3132.  
  3133.             if(Buffer = (STRPTR)AllocVecPooled(Len,MEMF_ANY))
  3134.             {
  3135.                 STRPTR Result;
  3136.  
  3137.                 if(DataHold && DataSize >= Len - 1)
  3138.                 {
  3139.                     CopyMem(DataHold,Buffer,Len - 1);
  3140.  
  3141.                     BytesRead = Len - 1;
  3142.  
  3143.                     if(DataSize == Len - 1)
  3144.                     {
  3145.                         DataHold = NULL;
  3146.  
  3147.                         RestartSerial();
  3148.                     }
  3149.                     else
  3150.                     {
  3151.                         DataHold += Len - 1;
  3152.                         DataSize -= Len - 1;
  3153.                     }
  3154.                 }
  3155.                 else
  3156.                 {
  3157.                     ULONG Signals,SignalMask = SIG_SERIAL | SIG_TIMER | SIG_BREAK;
  3158.  
  3159.                     ClearSerial();
  3160.  
  3161.                     ClrSignal(SignalMask);
  3162.  
  3163.                     if(RexxTimeoutVal)
  3164.                         StartTime(RexxTimeoutVal,0);
  3165.  
  3166.                     if(DataHold)
  3167.                     {
  3168.                         CopyMem(DataHold,Buffer,DataSize);
  3169.  
  3170.                         StartSerialRead(Buffer + DataSize,Len - 1 - DataSize);
  3171.  
  3172.                         BytesRead = DataSize;
  3173.  
  3174.                         DataHold = NULL;
  3175.                     }
  3176.                     else
  3177.                         StartSerialRead(Buffer,Len - 1);
  3178.  
  3179.                     FOREVER
  3180.                     {
  3181.                         Signals = Wait(SignalMask);
  3182.  
  3183.                         if(Signals & SIG_SERIAL)
  3184.                         {
  3185.                             if(RexxTimeoutVal)
  3186.                                 StopTime();
  3187.  
  3188.                                 /* Did the request terminate gracefully? */
  3189.  
  3190.                             if(!WaitSerialRead())
  3191.                             {
  3192.                                 BytesIn += ReadRequest -> IOSer . io_Actual;
  3193.  
  3194.                                 BytesRead = ReadRequest -> IOSer . io_Actual;
  3195.                             }
  3196.                             else
  3197.                                 Results[0] = RC_ERROR;
  3198.  
  3199.                             break;
  3200.                         }
  3201.  
  3202.                         if(Signals & SIG_BREAK)
  3203.                         {
  3204.                             StopSerialRead();
  3205.  
  3206.                             if(RexxTimeoutVal)
  3207.                                 StopTime();
  3208.  
  3209.                             Results[0] = RC_WARN;
  3210.  
  3211.                             break;
  3212.                         }
  3213.  
  3214.                         if(Signals & SIG_TIMER)
  3215.                         {
  3216.                             StopSerialRead();
  3217.  
  3218.                             WaitTime();
  3219.  
  3220.                             if(ReadRequest -> IOSer . io_Actual)
  3221.                             {
  3222.                                 BytesIn += ReadRequest -> IOSer . io_Actual;
  3223.  
  3224.                                 BytesRead = ReadRequest -> IOSer . io_Actual;
  3225.                             }
  3226.                             else
  3227.                             {
  3228.                                 ULONG Waiting = GetSerialWaiting();
  3229.  
  3230.                                 if(Waiting)
  3231.                                 {
  3232.                                         /* Don't read more than actually wanted. */
  3233.  
  3234.                                     if(!DoSerialRead(Buffer,MIN(Len - 1,Waiting)))
  3235.                                     {
  3236.                                         BytesIn += ReadRequest -> IOSer . io_Actual;
  3237.  
  3238.                                         BytesRead = ReadRequest -> IOSer . io_Actual;
  3239.                                     }
  3240.                                 }
  3241.                             }
  3242.  
  3243.                             break;
  3244.                         }
  3245.                     }
  3246.                 }
  3247.  
  3248.                 if(BytesRead)
  3249.                 {
  3250.                     STRPTR MetaBuffer;
  3251.  
  3252.                     if(MetaBuffer = AllocVecPooled(Len,MEMF_ANY))
  3253.                     {
  3254.                         struct TranslationHandle    Handle;
  3255.                         LONG                Bytes;
  3256.  
  3257.                         TranslateSetup(&Handle,Buffer,BytesRead,MetaBuffer,Len - 1,ReceiveTable);
  3258.  
  3259.                         Bytes = TranslateBuffer(&Handle);
  3260.  
  3261.                         Result = CreateResultLen(MetaBuffer,Results,Bytes);
  3262.  
  3263.                         FreeVecPooled(MetaBuffer);
  3264.                     }
  3265.                     else
  3266.                     {
  3267.                         Results[0] = RC_ERROR;
  3268.                         Results[1] = ERROR_NO_FREE_STORE;
  3269.  
  3270.                         Result = NULL;
  3271.                     }
  3272.                 }
  3273.                 else
  3274.                 {
  3275.                     Results[0] = RC_WARN;
  3276.  
  3277.                     Result = NULL;
  3278.                 }
  3279.  
  3280.                 FreeVecPooled(Buffer);
  3281.  
  3282.                 RestartSerial();
  3283.  
  3284.                 if(Args[ARG_READ_CR])
  3285.                 {
  3286.                     Forbid();
  3287.  
  3288.                     Window -> Flags &= ~WFLG_RMBTRAP;
  3289.  
  3290.                     LT_LockWindow(Window);
  3291.  
  3292.                     Permit();
  3293.                 }
  3294.  
  3295.                 ReleaseWindows();
  3296.  
  3297.                 return(Result);
  3298.             }
  3299.             else
  3300.             {
  3301.                 Results[0] = RC_ERROR;
  3302.                 Results[1] = ERROR_NO_FREE_STORE;
  3303.             }
  3304.  
  3305.             RestartSerial();
  3306.         }
  3307.     }
  3308.  
  3309.     if(Args[ARG_READ_CR])
  3310.     {
  3311.         Forbid();
  3312.  
  3313.         Window -> Flags &= ~WFLG_RMBTRAP;
  3314.  
  3315.         LT_LockWindow(Window);
  3316.  
  3317.         Permit();
  3318.     }
  3319.  
  3320.     ReleaseWindows();
  3321.  
  3322.     return(NULL);
  3323. }
  3324.  
  3325. STRPTR
  3326. RexxReceiveFile(struct RexxPkt *Pkt)
  3327. {
  3328.     enum    {    ARG_RECEIVEFILE_MODE,ARG_RECEIVEFILE_NAME };
  3329.  
  3330.     LONG    Mode = TRANSFER_BINARY;
  3331.     STRPTR    Name = (STRPTR)Args[ARG_RECEIVEFILE_NAME];
  3332.  
  3333.     if(Args[ARG_RECEIVEFILE_MODE])
  3334.         Mode = ToMode(Args[ARG_RECEIVEFILE_MODE]);
  3335.  
  3336.     if(Mode == -1)
  3337.     {
  3338.         Results[0] = RC_ERROR;
  3339.         Results[1] = ERROR_ACTION_NOT_KNOWN;
  3340.     }
  3341.     else
  3342.     {
  3343.         BlockWindows();
  3344.  
  3345.         switch(Mode)
  3346.         {
  3347.             case TRANSFER_ASCII:
  3348.  
  3349.                 if(ChangeProtocol(Config -> TransferConfig -> ASCIIDownloadLibrary,Config -> TransferConfig -> ASCIIDownloadType))
  3350.                 {
  3351.                     BinaryTransfer = FALSE;
  3352.  
  3353.                     StartXprReceive(TRANSFER_ASCII,Name,FALSE);
  3354.  
  3355.                     BinaryTransfer = TRUE;
  3356.  
  3357.                     SerialCommand(Config -> CommandConfig -> DownloadMacro);
  3358.                 }
  3359.                 else
  3360.                 {
  3361.                     Results[0] = RC_ERROR;
  3362.                     Results[1] = ERROR_NO_FREE_STORE;
  3363.                 }
  3364.  
  3365.                 ResetProtocol();
  3366.  
  3367.                 break;
  3368.  
  3369.             case TRANSFER_TEXT:
  3370.  
  3371.                 if(ChangeProtocol(Config -> TransferConfig -> TextDownloadLibrary,Config -> TransferConfig -> TextDownloadType))
  3372.                 {
  3373.                     BinaryTransfer = FALSE;
  3374.  
  3375.                     StartXprReceive(TRANSFER_TEXT,Name,FALSE);
  3376.  
  3377.                     BinaryTransfer = TRUE;
  3378.  
  3379.                     SerialCommand(Config -> CommandConfig -> DownloadMacro);
  3380.                 }
  3381.                 else
  3382.                 {
  3383.                     Results[0] = RC_ERROR;
  3384.                     Results[1] = ERROR_NO_FREE_STORE;
  3385.                 }
  3386.  
  3387.                 ResetProtocol();
  3388.  
  3389.                 break;
  3390.  
  3391.             case TRANSFER_BINARY:
  3392.  
  3393.                 if(ChangeProtocol(Config -> TransferConfig -> BinaryDownloadLibrary,Config -> TransferConfig -> BinaryDownloadType))
  3394.                 {
  3395.                     BinaryTransfer = TRUE;
  3396.  
  3397.                     StartXprReceive(TRANSFER_BINARY,Name,FALSE);
  3398.  
  3399.                     SerialCommand(Config -> CommandConfig -> DownloadMacro);
  3400.                 }
  3401.                 else
  3402.                 {
  3403.                     Results[0] = RC_ERROR;
  3404.                     Results[1] = ERROR_NO_FREE_STORE;
  3405.                 }
  3406.  
  3407.                 ResetProtocol();
  3408.  
  3409.                 break;
  3410.         }
  3411.  
  3412.         if(TransferFailed)
  3413.             Results[0] = RC_ERROR;
  3414.  
  3415.         if(TransferAborted)
  3416.             Results[0] = RC_WARN;
  3417.  
  3418.         ReleaseWindows();
  3419.     }
  3420.  
  3421.     return(NULL);
  3422. }
  3423.  
  3424. STRPTR
  3425. RexxRedial(struct RexxPkt *Pkt)
  3426. {
  3427.     if(DialList)
  3428.     {
  3429.         if(DialList -> lh_Head -> ln_Succ)
  3430.             DoDial = DIAL_REDIAL;
  3431.         else
  3432.             Results[0] = RC_WARN;
  3433.     }
  3434.     else
  3435.         Results[0] = RC_WARN;
  3436.  
  3437.     return(NULL);
  3438. }
  3439.  
  3440. STRPTR
  3441. RexxRemove(struct RexxPkt *Pkt)
  3442. {
  3443.     enum    {    ARG_REMOVE_FROM,ARG_REMOVE_NAME };
  3444.  
  3445.     LONG Index;
  3446.  
  3447.     if((Index = ToList(Args[ARG_REMOVE_FROM])) == -1)
  3448.     {
  3449.         Results[0] = RC_ERROR;
  3450.         Results[1] = TERMERROR_UNKNOWN_LIST;
  3451.     }
  3452.     else
  3453.     {
  3454.         if(Args[ARG_REMOVE_NAME] && Index == GLIST_DIAL)
  3455.         {
  3456.             Results[0] = RC_ERROR;
  3457.             Results[1] = TERMERROR_DATA_TYPES_INCOMPATIBLE;
  3458.         }
  3459.         else
  3460.         {
  3461.             struct GenericList *List;
  3462.  
  3463.             List = GenericListTable[Index];
  3464.  
  3465.             if(Args[ARG_REMOVE_NAME])
  3466.             {
  3467.                 STRPTR Buffer;
  3468.  
  3469.                 if(Buffer = CreateMatchBuffer(Args[ARG_REMOVE_NAME]))
  3470.                 {
  3471.                     struct Node *Node,*NextNode;
  3472.  
  3473.                     ObtainSemaphore(&List -> ListSemaphore);
  3474.  
  3475.                     Node = (struct Node *)List -> ListHeader . mlh_Head;
  3476.  
  3477.                     while(NextNode = Node -> ln_Succ)
  3478.                     {
  3479.                         if(MatchBuffer(Buffer,Node -> ln_Name))
  3480.                         {
  3481.                             Forbid();
  3482.  
  3483.                             ReleaseSemaphore(&List -> ListSemaphore);
  3484.  
  3485.                             DeleteGenericListNode(List,Node);
  3486.  
  3487.                             ObtainSemaphore(&List -> ListSemaphore);
  3488.  
  3489.                             Permit();
  3490.                         }
  3491.  
  3492.                         Node = NextNode;
  3493.                     }
  3494.  
  3495.                     ReleaseSemaphore(&List -> ListSemaphore);
  3496.  
  3497.                     DeleteMatchBuffer(Buffer);
  3498.                 }
  3499.                 else
  3500.                 {
  3501.                     Results[0] = RC_ERROR;
  3502.                     Results[1] = ERROR_NO_FREE_STORE;
  3503.                 }
  3504.             }
  3505.             else
  3506.                 DeleteGenericListNode(List,NULL);
  3507.  
  3508.             if(!GenericListCount(List))
  3509.                 Results[0] = RC_WARN;
  3510.         }
  3511.     }
  3512.  
  3513.     return(NULL);
  3514. }
  3515.  
  3516. STRPTR
  3517. RexxRequestFile(struct RexxPkt *Pkt)
  3518. {
  3519.     enum    {    ARG_REQUESTFILE_TITLE,ARG_REQUESTFILE_PATH,ARG_REQUESTFILE_FILE,
  3520.             ARG_REQUESTFILE_PATTERN,ARG_REQUESTFILE_MULTI,ARG_REQUESTFILE_NAME };
  3521.  
  3522.     if(Args[ARG_REQUESTFILE_MULTI] && !Args[ARG_REQUESTFILE_NAME])
  3523.     {
  3524.         Results[0] = RC_ERROR;
  3525.         Results[1] = TERMERROR_RESULT_VARIABLE_REQUIRED;
  3526.     }
  3527.     else
  3528.     {
  3529.         struct FileRequester    *FileRequester;
  3530.         UBYTE             DummyBuffer[MAX_FILENAME_LENGTH],
  3531.                     *DummyChar;
  3532.         STRPTR             FileName,
  3533.                      PathName;
  3534.  
  3535.         if(Args[ARG_REQUESTFILE_PATH])
  3536.         {
  3537.             PathName = Args[ARG_REQUESTFILE_PATH];
  3538.  
  3539.             if(Args[ARG_REQUESTFILE_FILE])
  3540.                 FileName = Args[ARG_REQUESTFILE_FILE];
  3541.             else
  3542.                 FileName = "";
  3543.         }
  3544.         else
  3545.         {
  3546.             PathName = "";
  3547.  
  3548.             if(Args[ARG_REQUESTFILE_FILE])
  3549.             {
  3550.                 strcpy(DummyBuffer,Args[ARG_REQUESTFILE_FILE]);
  3551.  
  3552.                 DummyChar = PathPart(DummyBuffer);
  3553.  
  3554.                 *DummyChar = 0;
  3555.  
  3556.                 PathName = DummyBuffer;
  3557.                 FileName = FilePart(Args[ARG_REQUESTFILE_FILE]);
  3558.             }
  3559.             else
  3560.                 FileName = "";
  3561.         }
  3562.  
  3563.         BlockWindows();
  3564.  
  3565.         if(FileRequester = GetFile(Window,Args[ARG_REQUESTFILE_TITLE],PathName,FileName,DummyBuffer,Args[ARG_REQUESTFILE_PATTERN],FALSE,Args[ARG_REQUESTFILE_MULTI] != NULL,FALSE,"Ok",TRUE))
  3566.         {
  3567.             if(Args[ARG_REQUESTFILE_NAME])
  3568.             {
  3569.                 if(Args[ARG_REQUESTFILE_MULTI])
  3570.                 {
  3571.                     UBYTE         DummyBuffer[MAX_FILENAME_LENGTH];
  3572.                     struct WBArg    *ArgList = FileRequester -> fr_ArgList;
  3573.                     LONG         i,Counted = 0;
  3574.  
  3575.                     for(i = 0 ; i < FileRequester -> fr_NumArgs ; i++)
  3576.                     {
  3577.                         if(ArgList[i] . wa_Name)
  3578.                         {
  3579.                             if(ArgList[i] . wa_Lock)
  3580.                             {
  3581.                                 if(!NameFromLock(ArgList[i] . wa_Lock,DummyBuffer,MAX_FILENAME_LENGTH))
  3582.                                 {
  3583.                                     Results[0] = RC_ERROR;
  3584.                                     Results[1] = IoErr();
  3585.  
  3586.                                     break;
  3587.                                 }
  3588.                             }
  3589.                             else
  3590.                                 strcpy(DummyBuffer,FileRequester -> fr_Drawer);
  3591.  
  3592.                             if(AddPart(DummyBuffer,ArgList[i] . wa_Name,MAX_FILENAME_LENGTH))
  3593.                             {
  3594.                                 if(CreateVarArgs(DummyBuffer,Pkt,"%s.%ld",Args[ARG_REQUESTFILE_NAME],i))
  3595.                                     Counted++;
  3596.                                 else
  3597.                                     break;
  3598.                             }
  3599.                             else
  3600.                             {
  3601.                                 Results[0] = RC_ERROR;
  3602.                                 Results[1] = IoErr();
  3603.  
  3604.                                 break;
  3605.                             }
  3606.                         }
  3607.                     }
  3608.  
  3609.                     if(Counted)
  3610.                     {
  3611.                         SPrintf(DummyBuffer,"%ld",Counted);
  3612.  
  3613.                         CreateVarArgs(DummyBuffer,Pkt,"%s.COUNT",Args[ARG_REQUESTFILE_NAME]);
  3614.                     }
  3615.  
  3616.                     FreeAslRequest(FileRequester);
  3617.                 }
  3618.                 else
  3619.                 {
  3620.                     FreeAslRequest(FileRequester);
  3621.  
  3622.                     ReleaseWindows();
  3623.  
  3624.                     return(CreateVar(DummyBuffer,Pkt,Args[ARG_REQUESTFILE_NAME]));
  3625.                 }
  3626.             }
  3627.             else
  3628.             {
  3629.                 FreeAslRequest(FileRequester);
  3630.  
  3631.                 ReleaseWindows();
  3632.  
  3633.                 return(CreateResult(DummyBuffer,Results));
  3634.             }
  3635.         }
  3636.         else
  3637.             Results[0] = RC_WARN;
  3638.  
  3639.         ReleaseWindows();
  3640.     }
  3641.  
  3642.     return(NULL);
  3643. }
  3644.  
  3645. STRPTR
  3646. RexxRequestNotify(struct RexxPkt *Pkt)
  3647. {
  3648.     enum    {    ARG_REQUESTNOTIFY_TITLE,ARG_REQUESTNOTIFY_PROMPT };
  3649.  
  3650.     struct EasyStruct Easy;
  3651.  
  3652.     Easy . es_StructSize    = sizeof(struct EasyStruct);
  3653.     Easy . es_Flags        = NULL;
  3654.     Easy . es_TextFormat    = Args[ARG_REQUESTNOTIFY_PROMPT];
  3655.     Easy . es_GadgetFormat    = LocaleString(MSG_GLOBAL_CONTINUE_TXT);
  3656.  
  3657.     if(Args[ARG_REQUESTNOTIFY_TITLE])
  3658.         Easy . es_Title    = Args[ARG_REQUESTNOTIFY_TITLE];
  3659.     else
  3660.         Easy . es_Title    = LocaleString(MSG_TERMAUX_TERM_REQUEST_TXT);
  3661.  
  3662.     BlockWindows();
  3663.  
  3664.     EasyRequestArgs(Window,&Easy,NULL,NULL);
  3665.  
  3666.     ReleaseWindows();
  3667.  
  3668.     return(NULL);
  3669. }
  3670.  
  3671. STRPTR
  3672. RexxRequestNumber(struct RexxPkt *Pkt)
  3673. {
  3674.     enum    {    ARG_REQUESTNUMBER_DEFAULT,ARG_REQUESTNUMBER_PROMPT };
  3675.  
  3676.     UBYTE DummyBuffer[MAX_FILENAME_LENGTH];
  3677.  
  3678.     if(Args[ARG_REQUESTNUMBER_DEFAULT])
  3679.         SPrintf(DummyBuffer,"%ld",*(LONG *)Args[ARG_REQUESTNUMBER_DEFAULT]);
  3680.     else
  3681.         DummyBuffer[0] = 0;
  3682.  
  3683.     BlockWindows();
  3684.  
  3685.     if(GetString(FALSE,FALSE,255,Args[ARG_REQUESTNUMBER_PROMPT],DummyBuffer))
  3686.     {
  3687.         STRPTR Index = DummyBuffer;
  3688.  
  3689.         while(*Index == ' ' || *Index == '\t')
  3690.             Index++;
  3691.  
  3692.         if(*Index)
  3693.         {
  3694.             LONG Value;
  3695.  
  3696.             if(StrToLong(DummyBuffer,&Value) == -1)
  3697.             {
  3698.                 Results[0] = RC_ERROR;
  3699.                 Results[1] = ERROR_BAD_NUMBER;
  3700.             }
  3701.             else
  3702.             {
  3703.                 ReleaseWindows();
  3704.  
  3705.                 SPrintf(DummyBuffer,"%ld",Value);
  3706.  
  3707.                 return(CreateResult(DummyBuffer,Results));
  3708.             }
  3709.         }
  3710.         else
  3711.             Results[0] = RC_WARN;
  3712.     }
  3713.     else
  3714.         Results[0] = RC_WARN;
  3715.  
  3716.     ReleaseWindows();
  3717.  
  3718.     return(NULL);
  3719. }
  3720.  
  3721. STRPTR
  3722. RexxRequestResponse(struct RexxPkt *Pkt)
  3723. {
  3724.     enum    {    ARG_REQUESTRESPONSE_TITLE,ARG_REQUESTRESPONSE_OPTIONS,
  3725.             ARG_REQUESTRESPONSE_PROMPT };
  3726.  
  3727.     struct EasyStruct    Easy;
  3728.     LONG            Result;
  3729.  
  3730.     Easy . es_StructSize    = sizeof(struct EasyStruct);
  3731.     Easy . es_Flags        = NULL;
  3732.     Easy . es_TextFormat    = Args[ARG_REQUESTRESPONSE_PROMPT];
  3733.  
  3734.     if(Args[ARG_REQUESTRESPONSE_OPTIONS])
  3735.         Easy . es_GadgetFormat = Args[ARG_REQUESTRESPONSE_OPTIONS];
  3736.     else
  3737.         Easy . es_GadgetFormat = LocaleString(MSG_GLOBAL_YES_NO_TXT);
  3738.  
  3739.     if(Args[ARG_REQUESTRESPONSE_TITLE])
  3740.         Easy . es_Title    = Args[ARG_REQUESTRESPONSE_TITLE];
  3741.     else
  3742.         Easy . es_Title    = LocaleString(MSG_TERMAUX_TERM_REQUEST_TXT);
  3743.  
  3744.     BlockWindows();
  3745.  
  3746.     Result = EasyRequestArgs(Window,&Easy,NULL,NULL);
  3747.  
  3748.     ReleaseWindows();
  3749.  
  3750.     if(Result)
  3751.     {
  3752.         UBYTE DummyBuffer[20];
  3753.  
  3754.         SPrintf(DummyBuffer,"%ld",Result);
  3755.  
  3756.         return(CreateResult(DummyBuffer,Results));
  3757.     }
  3758.     else
  3759.     {
  3760.         Results[0] = RC_WARN;
  3761.  
  3762.         return(NULL);
  3763.     }
  3764. }
  3765.  
  3766. STRPTR
  3767. RexxRequestString(struct RexxPkt *Pkt)
  3768. {
  3769.     enum    {    ARG_REQUESTSTRING_SECRET,ARG_REQUESTSTRING_DEFAULT,ARG_REQUESTSTRING_PROMPT };
  3770.  
  3771.     UBYTE DummyBuffer[MAX_FILENAME_LENGTH];
  3772.  
  3773.     if(Args[ARG_REQUESTSTRING_DEFAULT])
  3774.         strcpy(DummyBuffer,Args[ARG_REQUESTSTRING_DEFAULT]);
  3775.     else
  3776.         DummyBuffer[0] = 0;
  3777.  
  3778.     BlockWindows();
  3779.  
  3780.     if(GetString(FALSE,Args[ARG_REQUESTSTRING_SECRET] != NULL,255,Args[ARG_REQUESTSTRING_PROMPT],DummyBuffer))
  3781.     {
  3782.         ReleaseWindows();
  3783.  
  3784.         return(CreateResult(DummyBuffer,Results));
  3785.     }
  3786.     else
  3787.         Results[0] = RC_WARN;
  3788.  
  3789.     ReleaseWindows();
  3790.  
  3791.     return(NULL);
  3792. }
  3793.  
  3794. STRPTR
  3795. RexxResetScreen(struct RexxPkt *Pkt)
  3796. {
  3797.     if(XEmulatorBase && Config -> TerminalConfig -> EmulationMode == EMULATION_EXTERNAL)
  3798.         XEmulatorResetConsole(XEM_IO);
  3799.     else
  3800.     {
  3801.         FreeMarker();
  3802.  
  3803.         ObtainSemaphore(&TerminalSemaphore);
  3804.  
  3805.         ClearCursor();
  3806.  
  3807.         Reset();
  3808.  
  3809.         DrawCursor();
  3810.  
  3811.         ReleaseSemaphore(&TerminalSemaphore);
  3812.     }
  3813.  
  3814.     return(NULL);
  3815. }
  3816.  
  3817. STRPTR
  3818. RexxResetStyles(struct RexxPkt *Pkt)
  3819. {
  3820.     if(XEmulatorBase && Config -> TerminalConfig -> EmulationMode == EMULATION_EXTERNAL)
  3821.         XEmulatorResetTextStyles(XEM_IO);
  3822.     else
  3823.     {
  3824.         DropMarker();
  3825.  
  3826.         ConBypass("\033[0m",-1);
  3827.  
  3828.         ObtainSemaphore(&TerminalSemaphore);
  3829.  
  3830.         ClearCursor();
  3831.  
  3832.         Config -> EmulationConfig -> FontScale = SCALE_NORMAL;
  3833.  
  3834.         ForegroundPen = GetPenIndex(SafeTextPen);
  3835.         BackgroundPen = 0;
  3836.  
  3837.         UpdatePens();
  3838.  
  3839.         SetMask(RPort,DepthMask);
  3840.  
  3841.         ConFontScaleUpdate();
  3842.  
  3843.         DrawCursor();
  3844.  
  3845.         ReleaseSemaphore(&TerminalSemaphore);
  3846.     }
  3847.  
  3848.     return(NULL);
  3849. }
  3850.  
  3851. STRPTR
  3852. RexxResetText(struct RexxPkt *Pkt)
  3853. {
  3854.     if(XEmulatorBase && Config -> TerminalConfig -> EmulationMode == EMULATION_EXTERNAL)
  3855.         XEmulatorResetCharset(XEM_IO);
  3856.     else
  3857.     {
  3858.         DropMarker();
  3859.  
  3860.         CurrentFont = TextFont;
  3861.  
  3862.         SetFont(RPort,CurrentFont);
  3863.  
  3864.         ConOutputUpdate();
  3865.     }
  3866.  
  3867.     return(NULL);
  3868. }
  3869.  
  3870. STRPTR
  3871. RexxResetTimer(struct RexxPkt *Pkt)
  3872. {
  3873.     Forbid();
  3874.  
  3875.     if(StatusProcess)
  3876.         Signal(StatusProcess,SIG_RESETTIME);
  3877.  
  3878.     Permit();
  3879.  
  3880.     return(NULL);
  3881. }
  3882.  
  3883. STRPTR
  3884. RexxSaveAs(struct RexxPkt *Pkt)
  3885. {
  3886.     enum    {    ARG_SAVEAS_NAME,ARG_SAVEAS_FROM };
  3887.  
  3888.     LONG Index = ToConfig(Args[ARG_SAVEAS_FROM]);
  3889.  
  3890.     if(Index == -1)
  3891.     {
  3892.         Results[0] = RC_ERROR;
  3893.         Results[1] = ERROR_OBJECT_NOT_FOUND;
  3894.     }
  3895.     else
  3896.     {
  3897.         UBYTE    DummyBuffer[MAX_FILENAME_LENGTH];
  3898.         STRPTR    FileName;
  3899.  
  3900.         if(Args[ARG_SAVEAS_NAME])
  3901.             FileName = Args[ARG_SAVEAS_NAME];
  3902.         else
  3903.         {
  3904.             STRPTR             Title;
  3905.             struct FileRequester    *FileRequest;
  3906.  
  3907.             FileName = NULL;
  3908.  
  3909.             switch(Index)
  3910.             {
  3911.                 case DATATYPE_TRANSLATIONS:
  3912.  
  3913.                     Title = LocaleString(MSG_TRANSLATIONPANEL_SAVE_TRANSLATION_TABLES_TXT);
  3914.                     break;
  3915.  
  3916.                 case DATATYPE_FUNCTIONKEYS:
  3917.  
  3918.                     Title = LocaleString(MSG_MACROPANEL_SAVE_MACRO_KEYS_TXT);
  3919.                     break;
  3920.  
  3921.                 case DATATYPE_CURSORKEYS:
  3922.  
  3923.                     Title = LocaleString(MSG_CURSORPANEL_SAVE_CURSOR_KEYS_TXT);
  3924.                     break;
  3925.  
  3926.                 case DATATYPE_FASTMACROS:
  3927.  
  3928.                     Title = LocaleString(MSG_FASTMACROPANEL_SAVE_FAST_MACRO_SETTINGS_TXT);
  3929.                     break;
  3930.  
  3931.                 case DATATYPE_HOTKEYS:
  3932.  
  3933.                     Title = LocaleString(MSG_HOTKEYPANEL_SAVE_HOTKEYS_TXT);
  3934.                     break;
  3935.  
  3936.                 case DATATYPE_SPEECH:
  3937.  
  3938.                     Title = LocaleString(MSG_SPEECHPANEL_SAVE_SPEECH_SETTINGS_TXT);
  3939.                     break;
  3940.  
  3941.                 case DATATYPE_SOUND:
  3942.  
  3943.                     Title = LocaleString(MSG_SOUNDPANEL_SAVE_SOUNDS_TXT);
  3944.                     break;
  3945.  
  3946.                 case DATATYPE_BUFFER:
  3947.  
  3948.                     Title = LocaleString(MSG_TERMMAIN_SAVE_BUFFER_TXT);
  3949.                     break;
  3950.  
  3951.                 case DATATYPE_CONFIGURATION:
  3952.  
  3953.                     Title = LocaleString(MSG_TERMMAIN_SAVE_PREFERENCES_AS_TXT);
  3954.                     break;
  3955.  
  3956.                 case DATATYPE_PHONEBOOK:
  3957.  
  3958.                     Title = LocaleString(MSG_PHONEPANEL_SAVE_PHONEBOOK_TXT);
  3959.                     break;
  3960.  
  3961.                 case DATATYPE_SCREENTEXT:
  3962.  
  3963.                     Title = LocaleString(MSG_TERMMAIN_SAVE_SCREEN_ASCII_TXT);
  3964.                     break;
  3965.  
  3966.                 case DATATYPE_SCREENIMAGE:
  3967.  
  3968.                     Title = LocaleString(MSG_TERMMAIN_SAVE_SCREEN_IFF_TXT);
  3969.                     break;
  3970.             }
  3971.  
  3972.             BlockWindows();
  3973.  
  3974.             if(FileRequest = GetFile(Window,Title,"","",DummyBuffer,NULL,TRUE,FALSE,FALSE,NULL,TRUE))
  3975.             {
  3976.                 FileName = DummyBuffer;
  3977.  
  3978.                 FreeAslRequest(FileRequest);
  3979.             }
  3980.  
  3981.             ReleaseWindows();
  3982.         }
  3983.  
  3984.         if(FileName)
  3985.         {
  3986.             switch(Index)
  3987.             {
  3988.                 case DATATYPE_TRANSLATIONS:
  3989.                 {
  3990.                     if(SendTable && ReceiveTable)
  3991.                     {
  3992.                         if(!SaveTranslationTables(FileName,SendTable,ReceiveTable))
  3993.                         {
  3994.                             Results[0] = RC_ERROR;
  3995.                             Results[1] = IoErr();
  3996.                         }
  3997.                         else
  3998.                         {
  3999.                             strcpy(LastTranslation,FileName);
  4000.  
  4001.                             strcpy(Config->TranslationFileName,LastTranslation);
  4002.  
  4003.                             TranslationChanged = FALSE;
  4004.                         }
  4005.                     }
  4006.                     else
  4007.                         Results[0] = RC_WARN;
  4008.                 }
  4009.  
  4010.                 break;
  4011.  
  4012.                 case DATATYPE_FUNCTIONKEYS:
  4013.                 {
  4014.                     if(!WriteIFFData(FileName,MacroKeys,sizeof(struct MacroKeys),ID_KEYS))
  4015.                     {
  4016.                         Results[0] = RC_ERROR;
  4017.                         Results[1] = IoErr();
  4018.                     }
  4019.                     else
  4020.                     {
  4021.                         strcpy(LastMacros,FileName);
  4022.  
  4023.                         strcpy(Config->MacroFileName,LastMacros);
  4024.  
  4025.                         MacroChanged = FALSE;
  4026.                     }
  4027.                 }
  4028.  
  4029.                 break;
  4030.  
  4031.                 case DATATYPE_CURSORKEYS:
  4032.                 {
  4033.                     if(!WriteIFFData(FileName,CursorKeys,sizeof(struct CursorKeys),ID_KEYS))
  4034.                     {
  4035.                         Results[0] = RC_ERROR;
  4036.                         Results[1] = IoErr();
  4037.                     }
  4038.                     else
  4039.                     {
  4040.                         strcpy(LastCursorKeys,FileName);
  4041.  
  4042.                         strcpy(Config->CursorFileName,LastCursorKeys);
  4043.  
  4044.                         CursorKeysChanged = FALSE;
  4045.                     }
  4046.                 }
  4047.  
  4048.                 break;
  4049.  
  4050.                 case DATATYPE_FASTMACROS:
  4051.                 {
  4052.                     if(!SaveFastMacros(FileName,&FastMacroList))
  4053.                     {
  4054.                         Results[0] = RC_ERROR;
  4055.                         Results[1] = IoErr();
  4056.                     }
  4057.                     else
  4058.                     {
  4059.                         strcpy(LastFastMacros,FileName);
  4060.  
  4061.                         strcpy(Config->FastMacroFileName,LastFastMacros);
  4062.  
  4063.                         FastMacrosChanged = FALSE;
  4064.                     }
  4065.                 }
  4066.  
  4067.                 break;
  4068.  
  4069.                 case DATATYPE_HOTKEYS:
  4070.                 {
  4071.                     if(!WriteIFFData(FileName,&Hotkeys,sizeof(struct Hotkeys),ID_HOTK))
  4072.                     {
  4073.                         Results[0] = RC_ERROR;
  4074.                         Results[1] = IoErr();
  4075.                     }
  4076.                     else
  4077.                     {
  4078.                         strcpy(LastKeys,FileName);
  4079.  
  4080.                         strcpy(Config->HotkeyFileName,LastKeys);
  4081.  
  4082.                         HotkeysChanged = FALSE;
  4083.                     }
  4084.                 }
  4085.  
  4086.                 break;
  4087.  
  4088.                 case DATATYPE_SPEECH:
  4089.                 {
  4090.                     if(!WriteIFFData(FileName,&SpeechConfig,sizeof(struct SpeechConfig),ID_SPEK))
  4091.                     {
  4092.                         Results[0] = RC_ERROR;
  4093.                         Results[1] = IoErr();
  4094.                     }
  4095.                     else
  4096.                     {
  4097.                         strcpy(LastSpeech,FileName);
  4098.  
  4099.                         strcpy(Config->SpeechFileName,LastSpeech);
  4100.  
  4101.                         SpeechChanged = FALSE;
  4102.                     }
  4103.                 }
  4104.  
  4105.                 break;
  4106.  
  4107.                 case DATATYPE_SOUND:
  4108.                 {
  4109.                     if(!WriteIFFData(FileName,&SoundConfig,sizeof(struct SoundConfig),ID_SOUN))
  4110.                     {
  4111.                         Results[0] = RC_ERROR;
  4112.                         Results[1] = IoErr();
  4113.                     }
  4114.                     else
  4115.                     {
  4116.                         strcpy(LastSound,FileName);
  4117.  
  4118.                         strcpy(Config->SoundFileName,LastSound);
  4119.  
  4120.                         SoundChanged = FALSE;
  4121.                     }
  4122.                 }
  4123.  
  4124.                 break;
  4125.  
  4126.                 case DATATYPE_BUFFER:
  4127.                 {
  4128.                     if(BufferLines && Lines)
  4129.                     {
  4130.                         BPTR SomeFile;
  4131.  
  4132.                         if(GetFileSize(FileName))
  4133.                         {
  4134.                             if(SomeFile = Open(FileName,MODE_READWRITE))
  4135.                             {
  4136.                                 if(Seek(SomeFile,0,OFFSET_END) == -1)
  4137.                                 {
  4138.                                     Close(SomeFile);
  4139.  
  4140.                                     SomeFile = NULL;
  4141.  
  4142.                                     SetIoErr(ERROR_SEEK_ERROR);
  4143.                                 }
  4144.                             }
  4145.                         }
  4146.                         else
  4147.                             SomeFile = Open(FileName,MODE_NEWFILE);
  4148.  
  4149.                         if(SomeFile)
  4150.                         {
  4151.                             LONG i,Len;
  4152.  
  4153.                                 /* Obtain the semaphore required
  4154.                                  * to gain access to the line buffer
  4155.                                  */
  4156.  
  4157.                             ObtainSemaphore(BufferSemaphore);
  4158.  
  4159.                             for(i = 0 ; i < Lines ; i++)
  4160.                             {
  4161.                                 Len = BufferLines[i][-1];
  4162.  
  4163.                                 if(Len)
  4164.                                 {
  4165.                                     if(FWrite(SomeFile,BufferLines[i],Len,1) != 1)
  4166.                                     {
  4167.                                         Results[0] = RC_ERROR;
  4168.                                         Results[1] = IoErr();
  4169.  
  4170.                                         break;
  4171.                                     }
  4172.                                 }
  4173.  
  4174.                                 if(FPrintf(SomeFile,"\n") < 1)
  4175.                                 {
  4176.                                     Results[0] = RC_ERROR;
  4177.                                     Results[1] = IoErr();
  4178.  
  4179.                                     break;
  4180.                                 }
  4181.                             }
  4182.  
  4183.                             ReleaseSemaphore(BufferSemaphore);
  4184.  
  4185.                             Close(SomeFile);
  4186.  
  4187.                             AddProtection(FileName,FIBF_EXECUTE);
  4188.  
  4189.                             if(Config -> MiscConfig -> CreateIcons)
  4190.                                 AddIcon(FileName,FILETYPE_TEXT,TRUE);
  4191.  
  4192.                             BufferChanged = FALSE;
  4193.                         }
  4194.                         else
  4195.                         {
  4196.                             Results[0] = RC_ERROR;
  4197.                             Results[1] = IoErr();
  4198.                         }
  4199.                     }
  4200.                     else
  4201.                     {
  4202.                         Results[0] = RC_ERROR;
  4203.                         Results[1] = TERMERROR_NO_DATA_TO_PROCESS;
  4204.                     }
  4205.                 }
  4206.  
  4207.                 break;
  4208.  
  4209.                 case DATATYPE_CONFIGURATION:
  4210.                 {
  4211.                     if(!WriteConfig(FileName,Config))
  4212.                     {
  4213.                         Results[0] = RC_ERROR;
  4214.                         Results[1] = IoErr();
  4215.                     }
  4216.                     else
  4217.                     {
  4218.                         strcpy(LastConfig,FileName);
  4219.  
  4220.                         ConfigChanged = FALSE;
  4221.                     }
  4222.                 }
  4223.  
  4224.                 break;
  4225.  
  4226.                 case DATATYPE_PHONEBOOK:
  4227.                 {
  4228.                     if(!SavePhonebook(FileName))
  4229.                     {
  4230.                         Results[0] = RC_ERROR;
  4231.                         Results[1] = IoErr();
  4232.                     }
  4233.                     else
  4234.                     {
  4235.                         strcpy(LastPhone,FileName);
  4236.                         strcpy(Config->PhonebookFileName,LastPhone);
  4237.  
  4238.                         PhonebookChanged = FALSE;
  4239.                     }
  4240.                 }
  4241.  
  4242.                 break;
  4243.  
  4244.                 case DATATYPE_SCREENTEXT:
  4245.                 {
  4246.                     if(RasterEnabled)
  4247.                     {
  4248.                         BPTR SomeFile;
  4249.  
  4250.                         if(GetFileSize(FileName))
  4251.                         {
  4252.                             if(SomeFile = Open(FileName,MODE_READWRITE))
  4253.                             {
  4254.                                 if(Seek(SomeFile,0,OFFSET_END) == -1)
  4255.                                 {
  4256.                                     Close(SomeFile);
  4257.  
  4258.                                     SomeFile = NULL;
  4259.  
  4260.                                     SetIoErr(ERROR_SEEK_ERROR);
  4261.                                 }
  4262.                             }
  4263.                         }
  4264.                         else
  4265.                             SomeFile = Open(FileName,MODE_NEWFILE);
  4266.  
  4267.                         if(SomeFile)
  4268.                         {
  4269.                             LONG     i,j;
  4270.                             UBYTE    *Buffer;
  4271.  
  4272.                             for(i = 0 ; i < RasterHeight ; i++)
  4273.                             {
  4274.                                 Buffer = &Raster[i * RasterWidth];
  4275.  
  4276.                                 j = LastColumn;
  4277.  
  4278.                                 while(j >= 0 && Buffer[j] == ' ')
  4279.                                     j--;
  4280.  
  4281.                                 if(j >= 0)
  4282.                                 {
  4283.                                     if(!FWrite(SomeFile,Buffer,j + 1,1))
  4284.                                     {
  4285.                                         Results[0] = RC_ERROR;
  4286.                                         Results[1] = IoErr();
  4287.  
  4288.                                         break;
  4289.                                     }
  4290.                                 }
  4291.  
  4292.                                 if(!FWrite(SomeFile,"\n",1,1))
  4293.                                 {
  4294.                                     Results[0] = RC_ERROR;
  4295.                                     Results[1] = IoErr();
  4296.  
  4297.                                     break;
  4298.                                 }
  4299.                             }
  4300.  
  4301.                             Close(SomeFile);
  4302.  
  4303.                             AddProtection(FileName,FIBF_EXECUTE);
  4304.  
  4305.                             if(Config -> MiscConfig -> CreateIcons)
  4306.                                 AddIcon(FileName,FILETYPE_TEXT,TRUE);
  4307.                         }
  4308.                         else
  4309.                         {
  4310.                             Results[0] = RC_ERROR;
  4311.                             Results[1] = IoErr();
  4312.                         }
  4313.                     }
  4314.                     else
  4315.                     {
  4316.                         Results[0] = RC_ERROR;
  4317.                         Results[1] = TERMERROR_NO_DATA_TO_PROCESS;
  4318.                     }
  4319.                 }
  4320.  
  4321.                 break;
  4322.  
  4323.                 case DATATYPE_SCREENIMAGE:
  4324.                 {
  4325.                     if(!SaveWindow(FileName,Window))
  4326.                     {
  4327.                         Results[0] = RC_ERROR;
  4328.                         Results[1] = IoErr();
  4329.                     }
  4330.                 }
  4331.  
  4332.                 break;
  4333.             }
  4334.         }
  4335.         else
  4336.             Results[0] = RC_WARN;
  4337.     }
  4338.  
  4339.     return(NULL);
  4340. }
  4341.  
  4342. STRPTR
  4343. RexxSave(struct RexxPkt *Pkt)
  4344. {
  4345.     enum    {    ARG_SAVE_FROM };
  4346.  
  4347.     Args[1] = Args[ARG_SAVE_FROM];
  4348.     Args[0] = NULL;
  4349.  
  4350.     return(RexxSaveAs(Pkt));
  4351. }
  4352.  
  4353. STRPTR
  4354. RexxSelect(struct RexxPkt *Pkt)
  4355. {
  4356.     enum    {    ARG_SELECT_NAME,ARG_SELECT_FROM,ARG_SELECT_NEXT,ARG_SELECT_PREVIOUS,
  4357.             ARG_SELECT_TOP,ARG_SELECT_BOTTOM };
  4358.  
  4359.     LONG Index;
  4360.  
  4361.     if((Index = ToList(Args[ARG_SELECT_FROM])) == -1)
  4362.     {
  4363.         Results[0] = RC_ERROR;
  4364.         Results[1] = TERMERROR_UNKNOWN_LIST;
  4365.     }
  4366.     else
  4367.     {
  4368.         if(Args[ARG_SELECT_NAME] && Index == GLIST_DIAL)
  4369.         {
  4370.             Results[0] = RC_ERROR;
  4371.             Results[1] = TERMERROR_DATA_TYPES_INCOMPATIBLE;
  4372.         }
  4373.         else
  4374.         {
  4375.             struct GenericList *List;
  4376.  
  4377.             List = GenericListTable[Index];
  4378.  
  4379.             if(Args[ARG_SELECT_NAME])
  4380.             {
  4381.                 STRPTR Buffer;
  4382.  
  4383.                 if(Buffer = CreateMatchBuffer(Args[ARG_SELECT_NAME]))
  4384.                 {
  4385.                     struct Node *Node,*NextNode;
  4386.  
  4387.                     ObtainSemaphore(&List -> ListSemaphore);
  4388.  
  4389.                     Node = (struct Node *)List -> ListHeader . mlh_Head;
  4390.  
  4391.                     while(NextNode = Node -> ln_Succ)
  4392.                     {
  4393.                         if(MatchBuffer(Buffer,Node -> ln_Name))
  4394.                         {
  4395.                             List -> ListNode = Node;
  4396.  
  4397.                             Node = NULL;
  4398.  
  4399.                             break;
  4400.                         }
  4401.  
  4402.                         Node = NextNode;
  4403.                     }
  4404.  
  4405.                     if(Node)
  4406.                         Results[0] = RC_WARN;
  4407.  
  4408.                     ReleaseSemaphore(&List -> ListSemaphore);
  4409.  
  4410.                     DeleteMatchBuffer(Buffer);
  4411.                 }
  4412.                 else
  4413.                 {
  4414.                     Results[0] = RC_ERROR;
  4415.                     Results[1] = ERROR_NO_FREE_STORE;
  4416.                 }
  4417.             }
  4418.             else
  4419.             {
  4420.                 if(Args[ARG_SELECT_NEXT])
  4421.                 {
  4422.                     if(!NextGenericListNode(List))
  4423.                     {
  4424.                         Results[0] = RC_WARN;
  4425.  
  4426.                         return(NULL);
  4427.                     }
  4428.                 }
  4429.  
  4430.                 if(Args[ARG_SELECT_PREVIOUS])
  4431.                 {
  4432.                     if(!PrevGenericListNode(List))
  4433.                     {
  4434.                         Results[0] = RC_WARN;
  4435.  
  4436.                         return(NULL);
  4437.                     }
  4438.                 }
  4439.  
  4440.                 if(Args[ARG_SELECT_TOP])
  4441.                 {
  4442.                     if(!FirstGenericListNode(List))
  4443.                     {
  4444.                         Results[0] = RC_WARN;
  4445.  
  4446.                         return(NULL);
  4447.                     }
  4448.                 }
  4449.  
  4450.                 if(Args[ARG_SELECT_BOTTOM])
  4451.                 {
  4452.                     if(!LastGenericListNode(List))
  4453.                     {
  4454.                         Results[0] = RC_WARN;
  4455.  
  4456.                         return(NULL);
  4457.                     }
  4458.                 }
  4459.             }
  4460.  
  4461.             ObtainSemaphore(&List -> ListSemaphore);
  4462.  
  4463.             if(List -> ListNode)
  4464.             {
  4465.                 if(Index != GLIST_DIAL)
  4466.                 {
  4467.                     struct Node    *Node = (struct Node *)List -> ListNode;
  4468.                     STRPTR         Result;
  4469.  
  4470.                     Result = CreateResult(Node -> ln_Name,Results);
  4471.  
  4472.                     ReleaseSemaphore(&List -> ListSemaphore);
  4473.  
  4474.                     return(Result);
  4475.                 }
  4476.             }
  4477.             else
  4478.                 Results[0] = RC_WARN;
  4479.  
  4480.             ReleaseSemaphore(&List -> ListSemaphore);
  4481.         }
  4482.     }
  4483.  
  4484.     return(NULL);
  4485. }
  4486.  
  4487. STRPTR
  4488. RexxSend(struct RexxPkt *Pkt)
  4489. {
  4490.     enum    {    ARG_SEND_NOECHO,ARG_SEND_LOCAL,ARG_SEND_LITERAL,ARG_SEND_BYTE,ARG_SEND_TEXT };
  4491.  
  4492.     if(Args[ARG_SEND_LOCAL])
  4493.     {
  4494.         if(!Args[ARG_SEND_NOECHO])
  4495.         {
  4496.             if(Marking)
  4497.                 DropMarker();
  4498.  
  4499.             if(Args[ARG_SEND_TEXT])
  4500.             {
  4501.                 if(Args[ARG_SEND_LITERAL])
  4502.                     ConProcess(Args[ARG_SEND_TEXT],strlen(Args[ARG_SEND_TEXT]));
  4503.                 else
  4504.                     ConsoleCommand(Args[ARG_SEND_TEXT]);
  4505.             }
  4506.             else
  4507.             {
  4508.                 UBYTE Byte = *(LONG *)Args[ARG_SEND_BYTE];
  4509.  
  4510.                 ConProcess(&Byte,1);
  4511.             }
  4512.         }
  4513.     }
  4514.     else
  4515.     {
  4516.         if(Args[ARG_SEND_NOECHO])
  4517.             Quiet = TRUE;
  4518.  
  4519.         if(Args[ARG_SEND_TEXT])
  4520.         {
  4521.             if(Args[ARG_SEND_LITERAL])
  4522.                 SerWrite(Args[ARG_SEND_TEXT],strlen(Args[ARG_SEND_TEXT]));
  4523.             else
  4524.                 SerialCommand(Args[ARG_SEND_TEXT]);
  4525.         }
  4526.         else
  4527.         {
  4528.             UBYTE Byte = *(LONG *)Args[ARG_SEND_BYTE];
  4529.  
  4530.             SerWrite(&Byte,1);
  4531.         }
  4532.  
  4533.         Quiet = FALSE;
  4534.     }
  4535.  
  4536.     return(NULL);
  4537. }
  4538.  
  4539. STRPTR
  4540. RexxSendBreak(struct RexxPkt *Pkt)
  4541. {
  4542.     if(WriteRequest)
  4543.         SendBreak();
  4544.     else
  4545.         Results[0] = RC_WARN;
  4546.  
  4547.     return(NULL);
  4548. }
  4549.  
  4550. STRPTR
  4551. RexxSendFile(struct RexxPkt *Pkt)
  4552. {
  4553.     enum    {    ARG_SENDFILE_MODE,ARG_SENDFILE_NAMES };
  4554.  
  4555.     LONG Mode = TRANSFER_BINARY;
  4556.  
  4557.     if(Args[ARG_SENDFILE_MODE])
  4558.         Mode = ToMode(Args[ARG_SENDFILE_MODE]);
  4559.  
  4560.     if(Mode == -1)
  4561.     {
  4562.         Results[0] = RC_ERROR;
  4563.         Results[1] = ERROR_ACTION_NOT_KNOWN;
  4564.     }
  4565.     else
  4566.     {
  4567.         struct FileTransferInfo    *Info;
  4568.         LONG             FilesFound = 0;
  4569.         UBYTE             LocalBuffer[MAX_FILENAME_LENGTH];
  4570.  
  4571.         Results[0] = RC_OK;
  4572.  
  4573.         DB(kprintf("> allocfiletransferinfo\n"));
  4574.         if(Info = AllocFileTransferInfo())
  4575.         {
  4576.             struct GenericList *List = GenericListTable[GLIST_UPLOAD];
  4577.  
  4578.             if(Args[ARG_SENDFILE_NAMES])
  4579.             {
  4580.                 struct FileInfoBlock __aligned     FileInfo;
  4581.                 STRPTR                *Names = (STRPTR *)Args[ARG_SENDFILE_NAMES];
  4582.                 BPTR                 FileLock,NewDir,OldDir;
  4583.  
  4584.                 NewDir = NULL;
  4585.  
  4586.                 switch(Mode)
  4587.                 {
  4588.                     case TRANSFER_BINARY:
  4589.  
  4590.                         if(Config -> PathConfig -> BinaryUploadPath[0])
  4591.                             NewDir = Lock(Config -> PathConfig -> BinaryUploadPath,ACCESS_READ);
  4592.  
  4593.                         break;
  4594.  
  4595.                     case TRANSFER_TEXT:
  4596.  
  4597.                         if(Config -> PathConfig -> TextUploadPath[0])
  4598.                             NewDir = Lock(Config -> PathConfig -> TextUploadPath,ACCESS_READ);
  4599.  
  4600.                         break;
  4601.  
  4602.                     case TRANSFER_ASCII:
  4603.  
  4604.                         if(Config -> PathConfig -> ASCIIUploadPath[0])
  4605.                             NewDir = Lock(Config -> PathConfig -> ASCIIUploadPath,ACCESS_READ);
  4606.  
  4607.                         break;
  4608.                 }
  4609.  
  4610.                 if(NewDir)
  4611.                     OldDir = CurrentDir(NewDir);
  4612.  
  4613.                 while(*Names && Results[0] == RC_OK)
  4614.                 {
  4615.                     if(FileLock = Lock(*Names,ACCESS_READ))
  4616.                     {
  4617.                         if(Examine(FileLock,&FileInfo))
  4618.                         {
  4619.                             if(FileInfo . fib_DirEntryType < 0)
  4620.                             {
  4621.                                 if(NameFromLock(FileLock,LocalBuffer,MAX_FILENAME_LENGTH))
  4622.                                 {
  4623.                                     if(AddFileTransferNode(Info,LocalBuffer,FileInfo . fib_Size))
  4624.                                         FilesFound++;
  4625.                                     else
  4626.                                     {
  4627.                                         Results[0] = RC_ERROR;
  4628.                                         Results[1] = ERROR_NO_FREE_STORE;
  4629.                                     }
  4630.                                 }
  4631.                                 else
  4632.                                 {
  4633.                                     Results[0] = RC_ERROR;
  4634.                                     Results[1] = IoErr();
  4635.                                 }
  4636.                             }
  4637.                             else
  4638.                             {
  4639.                                 Results[0] = RC_ERROR;
  4640.                                 Results[1] = ERROR_OBJECT_WRONG_TYPE;
  4641.                             }
  4642.                         }
  4643.                         else
  4644.                         {
  4645.                             Results[0] = RC_ERROR;
  4646.                             Results[1] = IoErr();
  4647.                         }
  4648.  
  4649.                         UnLock(FileLock);
  4650.                     }
  4651.                     else
  4652.                     {
  4653.                         Results[0] = RC_ERROR;
  4654.                         Results[1] = IoErr();
  4655.                     }
  4656.  
  4657.                     Names++;
  4658.                 }
  4659.  
  4660.                 if(NewDir)
  4661.                 {
  4662.                     CurrentDir(OldDir);
  4663.                     UnLock(NewDir);
  4664.                 }
  4665.             }
  4666.  
  4667.             ObtainSemaphore(&List -> ListSemaphore);
  4668.  
  4669.             DB(kprintf("> building list\n"));
  4670.             if(List -> ListHeader . mlh_Head -> mln_Succ && Results[0] == RC_OK)
  4671.             {
  4672.                 struct FileInfoBlock __aligned     FileInfo;
  4673.                 struct Node            *Node;
  4674.                 BPTR                 NewDir,OldDir;
  4675.                 BPTR                 FileLock;
  4676.  
  4677.                 NewDir = NULL;
  4678.  
  4679.                 switch(Mode)
  4680.                 {
  4681.                     case TRANSFER_BINARY:
  4682.  
  4683.                         if(Config -> PathConfig -> BinaryUploadPath[0])
  4684.                             NewDir = Lock(Config -> PathConfig -> BinaryUploadPath,ACCESS_READ);
  4685.  
  4686.                         break;
  4687.  
  4688.                     case TRANSFER_TEXT:
  4689.  
  4690.                         if(Config -> PathConfig -> TextUploadPath[0])
  4691.                             NewDir = Lock(Config -> PathConfig -> TextUploadPath,ACCESS_READ);
  4692.  
  4693.                         break;
  4694.  
  4695.                     case TRANSFER_ASCII:
  4696.  
  4697.                         if(Config -> PathConfig -> ASCIIUploadPath[0])
  4698.                             NewDir = Lock(Config -> PathConfig -> ASCIIUploadPath,ACCESS_READ);
  4699.  
  4700.                         break;
  4701.                 }
  4702.  
  4703.                 DB(kprintf("> changedir\n"));
  4704.                 if(NewDir)
  4705.                     OldDir = CurrentDir(NewDir);
  4706.  
  4707.                 for(Node = (struct Node *)List -> ListHeader . mlh_Head ; Node -> ln_Succ && Results[0] == RC_OK ; Node = Node -> ln_Succ)
  4708.                 {
  4709.                     if(FileLock = Lock(Node -> ln_Name,ACCESS_READ))
  4710.                     {
  4711.                         if(Examine(FileLock,&FileInfo))
  4712.                         {
  4713.                             if(FileInfo . fib_DirEntryType < 0)
  4714.                             {
  4715.                                 if(NameFromLock(FileLock,LocalBuffer,MAX_FILENAME_LENGTH))
  4716.                                 {
  4717.                                     DB(kprintf("> adding |%s|\n",LocalBuffer));
  4718.                                     if(AddFileTransferNode(Info,LocalBuffer,FileInfo . fib_Size))
  4719.                                         FilesFound++;
  4720.                                     else
  4721.                                     {
  4722.                                         Results[0] = RC_ERROR;
  4723.                                         Results[1] = ERROR_NO_FREE_STORE;
  4724.                                     }
  4725.                                 }
  4726.                                 else
  4727.                                 {
  4728.                                     Results[0] = RC_ERROR;
  4729.                                     Results[1] = IoErr();
  4730.                                 }
  4731.                             }
  4732.                             else
  4733.                             {
  4734.                                 Results[0] = RC_ERROR;
  4735.                                 Results[1] = ERROR_OBJECT_WRONG_TYPE;
  4736.                             }
  4737.                         }
  4738.                         else
  4739.                         {
  4740.                             Results[0] = RC_ERROR;
  4741.                             Results[1] = IoErr();
  4742.                         }
  4743.  
  4744.                         UnLock(FileLock);
  4745.                     }
  4746.                     else
  4747.                     {
  4748.                         Results[0] = RC_ERROR;
  4749.                         Results[1] = IoErr();
  4750.                     }
  4751.                 }
  4752.  
  4753.                 DB(kprintf("> move back\n"));
  4754.                 if(NewDir)
  4755.                 {
  4756.                     CurrentDir(OldDir);
  4757.                     UnLock(NewDir);
  4758.                 }
  4759.             }
  4760.  
  4761.             ReleaseSemaphore(&List -> ListSemaphore);
  4762.  
  4763.             if(Results[0] == RC_OK)
  4764.             {
  4765.                 BlockWindows();
  4766.  
  4767.                 if(FilesFound)
  4768.                 {
  4769.                     DB(kprintf("> sorting\n"));
  4770.                     SortFileTransferInfo(Info);
  4771.  
  4772.                     FileTransferInfo = Info;
  4773.                 }
  4774.  
  4775.                 switch(Mode)
  4776.                 {
  4777.                     case TRANSFER_ASCII:
  4778.  
  4779.                         if(ChangeProtocol(Config -> TransferConfig -> ASCIIUploadLibrary,Config -> TransferConfig -> ASCIIUploadType))
  4780.                         {
  4781.                             BinaryTransfer = FALSE;
  4782.  
  4783.                             if(FilesFound)
  4784.                                 StartXprSendFromList(TRANSFER_ASCII,FALSE);
  4785.                             else
  4786.                                 StartXprSend(TRANSFER_ASCII,FALSE);
  4787.  
  4788.                             BinaryTransfer = TRUE;
  4789.                         }
  4790.                         else
  4791.                         {
  4792.                             Results[0] = RC_ERROR;
  4793.                             Results[1] = ERROR_NO_FREE_STORE;
  4794.                         }
  4795.  
  4796.                         ResetProtocol();
  4797.  
  4798.                         break;
  4799.  
  4800.                     case TRANSFER_TEXT:
  4801.  
  4802.                         if(ChangeProtocol(Config -> TransferConfig -> TextUploadLibrary,Config -> TransferConfig -> TextUploadType))
  4803.                         {
  4804.                             BinaryTransfer = FALSE;
  4805.  
  4806.                             if(FilesFound)
  4807.                                 StartXprSendFromList(TRANSFER_TEXT,FALSE);
  4808.                             else
  4809.                                 StartXprSend(TRANSFER_TEXT,FALSE);
  4810.  
  4811.                             BinaryTransfer = TRUE;
  4812.                         }
  4813.                         else
  4814.                         {
  4815.                             Results[0] = RC_ERROR;
  4816.                             Results[1] = ERROR_NO_FREE_STORE;
  4817.                         }
  4818.  
  4819.                         ResetProtocol();
  4820.  
  4821.                         break;
  4822.  
  4823.                     case TRANSFER_BINARY:
  4824.  
  4825.                         if(ChangeProtocol(Config -> TransferConfig -> BinaryUploadLibrary,Config -> TransferConfig -> BinaryUploadType))
  4826.                         {
  4827.                             BinaryTransfer = TRUE;
  4828.  
  4829.                             DB(kprintf("> starting\n"));
  4830.                             if(FilesFound)
  4831.                                 StartXprSendFromList(TRANSFER_BINARY,FALSE);
  4832.                             else
  4833.                                 StartXprSend(TRANSFER_BINARY,FALSE);
  4834.                         }
  4835.                         else
  4836.                         {
  4837.                             Results[0] = RC_ERROR;
  4838.                             Results[1] = ERROR_NO_FREE_STORE;
  4839.                         }
  4840.  
  4841.                         ResetProtocol();
  4842.  
  4843.                         break;
  4844.                 }
  4845.  
  4846.                 DB(kprintf("> thats it\n"));
  4847.                 if(TransferFailed)
  4848.                     Results[0] = RC_ERROR;
  4849.  
  4850.                 if(TransferAborted)
  4851.                     Results[0] = RC_WARN;
  4852.  
  4853.                 ReleaseWindows();
  4854.             }
  4855.             else
  4856.                 FreeFileTransferInfo(Info);
  4857.         }
  4858.         else
  4859.         {
  4860.             Results[0] = RC_ERROR;
  4861.             Results[1] = ERROR_NO_FREE_STORE;
  4862.         }
  4863.     }
  4864.  
  4865.     return(NULL);
  4866. }
  4867.  
  4868. STRPTR
  4869. RexxSpeak(struct RexxPkt *Pkt)
  4870. {
  4871.     enum    {    ARG_SPEAK_TEXT };
  4872.  
  4873.     if(SpeechConfig . Enabled && English)
  4874.         Say(Args[ARG_SPEAK_TEXT]);
  4875.     else
  4876.         Results[0] = RC_WARN;
  4877.  
  4878.     return(NULL);
  4879. }
  4880.  
  4881. STRPTR
  4882. RexxStopBits(struct RexxPkt *Pkt)
  4883. {
  4884.     enum    {    ARG_STOPBITS_0,ARG_STOPBITS_1 };
  4885.  
  4886.     LONG Bits;
  4887.  
  4888.     if(Args[ARG_STOPBITS_0])
  4889.         Bits = 0;
  4890.  
  4891.     if(Args[ARG_STOPBITS_1])
  4892.         Bits = 1;
  4893.  
  4894.     if(Config -> SerialConfig -> StopBits != Bits)
  4895.     {
  4896.         Config -> SerialConfig -> StopBits = Bits;
  4897.  
  4898.         UpdateRequired = TRUE;
  4899.  
  4900.         ConfigChanged = TRUE;
  4901.     }
  4902.  
  4903.     return(NULL);
  4904. }
  4905.  
  4906. STRPTR
  4907. RexxTextBuffer(struct RexxPkt *Pkt)
  4908. {
  4909.     enum    {    ARG_TEXTBUFFER_LOCK,ARG_TEXTBUFFER_UNLOCK };
  4910.  
  4911.     Forbid();
  4912.  
  4913.     if(Args[ARG_TEXTBUFFER_LOCK])
  4914.         BufferFrozen = TRUE;
  4915.  
  4916.     if(Args[ARG_TEXTBUFFER_UNLOCK])
  4917.         BufferFrozen = FALSE;
  4918.  
  4919.     CheckItem(MEN_FREEZE_BUFFER,BufferFrozen);
  4920.  
  4921.     ConOutputUpdate();
  4922.  
  4923.     Permit();
  4924.  
  4925.     return(NULL);
  4926. }
  4927.  
  4928. STRPTR
  4929. RexxTimeout(struct RexxPkt *Pkt)
  4930. {
  4931.     enum    {    ARG_TIMEOUT_SECONDS,ARG_TIMEOUT_OFF };
  4932.  
  4933.     if(Args[ARG_TIMEOUT_OFF])
  4934.         RexxTimeoutVal = 0;
  4935.     else
  4936.         RexxTimeoutVal = *(LONG *)Args[ARG_TIMEOUT_SECONDS];
  4937.  
  4938.     return(NULL);
  4939.  
  4940. }
  4941.  
  4942. STRPTR
  4943. RexxTrap(struct RexxPkt *Pkt)
  4944. {
  4945.     enum    {    ARG_TRAP_ON,ARG_TRAP_OFF };
  4946.  
  4947.     BOOL Enabled;
  4948.  
  4949.     Forbid();
  4950.  
  4951.     if(Args[ARG_TRAP_ON])
  4952.         Enabled = TRUE;
  4953.  
  4954.     if(Args[ARG_TRAP_OFF])
  4955.         Enabled = FALSE;
  4956.  
  4957.     CheckItem(MEN_DISABLE_TRAPS,Enabled ^ TRUE);
  4958.  
  4959.     Permit();
  4960.  
  4961.     ObtainSemaphore(&GenericListTable[GLIST_TRAP] -> ListSemaphore);
  4962.  
  4963.     if(GenericListTable[GLIST_TRAP] -> ListHeader . mlh_Head -> mln_Succ && Enabled)
  4964.         WatchTraps = TRUE;
  4965.     else
  4966.         WatchTraps = FALSE;
  4967.  
  4968. #ifdef FILTER_TRAPS
  4969.     ConOutputUpdate();
  4970. #endif    // FILTER_TRAPS
  4971.  
  4972.     ReleaseSemaphore(&GenericListTable[GLIST_TRAP] -> ListSemaphore);
  4973.  
  4974.     return(NULL);
  4975. }
  4976.  
  4977. STATIC STRPTR         RexxWaitResult;
  4978. STATIC struct WaitNode    *RexxWaitNode;
  4979.  
  4980. STATIC BOOL
  4981. RexxWaitBypass(STRPTR Buffer,LONG Size)
  4982. {
  4983.     LONG Position;
  4984.  
  4985.     RexxWaitResult = ScanNodeFilter(Buffer,Size,RexxWaitNode,&Position);
  4986.  
  4987.     SerWriteVerbatim(Buffer,Size,FALSE);
  4988.  
  4989.     return(FALSE);
  4990. }
  4991.  
  4992. STRPTR
  4993. RexxWait(struct RexxPkt *Pkt)
  4994. {
  4995.     enum    {    ARG_WAIT_NOECHO,ARG_WAIT_TEXT };
  4996.  
  4997.     ULONG         Signals;
  4998.     STRPTR         Result = NULL;
  4999.     BOOL         Echo;
  5000.     struct WaitNode    *WaitNode,
  5001.              Node;
  5002.     UBYTE         DummyBuffer[MAX_FILENAME_LENGTH];
  5003.     LONG         Position;
  5004.     struct List     DummyList;
  5005.  
  5006.     if(!ReadRequest || !WriteRequest)
  5007.     {
  5008.         Results[0] = RC_WARN;
  5009.  
  5010.         return(NULL);
  5011.     }
  5012.  
  5013.     if(Args[ARG_WAIT_NOECHO])
  5014.         Echo = FALSE;
  5015.     else
  5016.         Echo = TRUE;
  5017.  
  5018.     if(Args[ARG_WAIT_TEXT])
  5019.     {
  5020.         LONG i,Len;
  5021.  
  5022.         NewList(&DummyList);
  5023.  
  5024.         CopyMem(Args[ARG_WAIT_TEXT],DummyBuffer,255);
  5025.  
  5026.         DummyBuffer[255] = 0;
  5027.  
  5028.         for(i = 0 ; i < strlen(DummyBuffer) ; i++)
  5029.             DummyBuffer[i] = ToUpper(DummyBuffer[i]);
  5030.  
  5031.         Len = TranslateString(DummyBuffer,DummyBuffer);
  5032.  
  5033.         DummyBuffer[Len] = 0;
  5034.  
  5035.         memset(&Node,0,sizeof(struct WaitNode));
  5036.  
  5037.         Node . Node . ln_Name    = DummyBuffer;
  5038.         Node . Count        = 0;
  5039.  
  5040.         WaitNode = &Node;
  5041.  
  5042.         AddTail(&DummyList,(struct Node *)WaitNode);
  5043.     }
  5044.     else
  5045.     {
  5046.         if(!GenericListCount(GenericListTable[GLIST_WAIT]))
  5047.         {
  5048.             Results[0] = RC_ERROR;
  5049.             Results[1] = TERMERROR_LIST_IS_ALREADY_EMPTY;
  5050.  
  5051.             return(NULL);
  5052.         }
  5053.         else
  5054.         {
  5055.             WaitNode = (struct WaitNode *)GenericListTable[GLIST_WAIT] -> ListHeader . mlh_Head;
  5056.  
  5057.             while(WaitNode -> Node . ln_Succ)
  5058.             {
  5059.                 WaitNode -> Count = 0;
  5060.  
  5061.                 WaitNode = (struct WaitNode *)WaitNode -> Node . ln_Succ;
  5062.             }
  5063.  
  5064.             WaitNode = NULL;
  5065.         }
  5066.     }
  5067.  
  5068.     if(RexxTimeoutVal)
  5069.         StartTime(RexxTimeoutVal,0);
  5070.  
  5071.     WaitCount = 0;
  5072.  
  5073.     BlockWindows();
  5074.  
  5075.     Forbid();
  5076.  
  5077.     LT_UnlockWindow(Window);
  5078.  
  5079.     Window -> Flags |= WFLG_RMBTRAP;
  5080.  
  5081.     Permit();
  5082.  
  5083.     if(Marking)
  5084.         DropMarker();
  5085.  
  5086.     NormalCursor();
  5087.  
  5088.     if(DataHold)
  5089.     {
  5090.         if(Echo)
  5091.         {
  5092.             ConProcess(DataHold,DataSize);
  5093.  
  5094.             Status = STATUS_READY;
  5095.         }
  5096.  
  5097.         if(Result = ScanNodeFilter(DataHold,DataSize,WaitNode,&Position))
  5098.         {
  5099.             if(Position < DataSize)
  5100.             {
  5101.                 DataHold += Position;
  5102.                 DataSize -= Position;
  5103.             }
  5104.             else
  5105.             {
  5106.                 DataHold = NULL;
  5107.  
  5108.                 RestartSerial();
  5109.             }
  5110.         }
  5111.         else
  5112.         {
  5113.             DataHold = NULL;
  5114.  
  5115.             RestartSerial();
  5116.         }
  5117.     }
  5118.  
  5119.     if(!Result)
  5120.     {
  5121.         if(CheckSerialRead())
  5122.             Signals = SIG_SERIAL;
  5123.         else
  5124.             Signals = NULL;
  5125.  
  5126.         do
  5127.         {
  5128.             if(Signals & SIG_WINDOW)
  5129.             {
  5130.                 if(!Result)
  5131.                 {
  5132.                     SerWriteBypass = RexxWaitBypass;
  5133.  
  5134.                     RexxWaitResult    = Result;
  5135.                     RexxWaitNode    = WaitNode;
  5136.  
  5137.                     while(HandleWindow());
  5138.  
  5139.                     Result = RexxWaitResult;
  5140.  
  5141.                     SerWriteBypass = NULL;
  5142.                 }
  5143.             }
  5144.  
  5145.             if(Signals & SIG_SERIAL)
  5146.             {
  5147.                 BOOL Restart = TRUE;
  5148.  
  5149.                 if(!WaitSerialRead())
  5150.                 {
  5151.                     LONG Length;
  5152.  
  5153.                     BytesIn++;
  5154.  
  5155.                     if(Translate_CR_LF)
  5156.                         Length = (*Translate_CR_LF)(ReadBuffer,1);
  5157.                     else
  5158.                         Length = 1;
  5159.  
  5160.                     if(Echo && Length)
  5161.                     {
  5162.                         ConProcess(ReadBuffer,Length);
  5163.  
  5164.                         Status = STATUS_READY;
  5165.                     }
  5166.  
  5167.                     if(!Result && Length)
  5168.                         Result = ScanNodeFilter(ReadBuffer,Length,WaitNode,&Position);
  5169.  
  5170.                     if(!Result)
  5171.                     {
  5172.                             /* Check how many bytes are still in
  5173.                              * the serial buffer.
  5174.                              */
  5175.  
  5176.                         if(Length = GetSerialWaiting())
  5177.                         {
  5178.                             if(Length > SerialBufferSize)
  5179.                                 Length = SerialBufferSize;
  5180.  
  5181.                             if(Length > Config -> SerialConfig -> Quantum)
  5182.                                 Length = Config -> SerialConfig -> Quantum;
  5183.  
  5184.                             if(!DoSerialRead(ReadBuffer,Length))
  5185.                             {
  5186.                                 BytesIn += Length;
  5187.  
  5188.                                 if(Translate_CR_LF)
  5189.                                     Length = (* Translate_CR_LF)(ReadBuffer,Length);
  5190.  
  5191.                                 if(Length)
  5192.                                 {
  5193.                                         /* Send the data to the console. */
  5194.  
  5195.                                     if(Echo)
  5196.                                     {
  5197.                                         ConProcess(ReadBuffer,Length);
  5198.  
  5199.                                         Status = STATUS_READY;
  5200.                                     }
  5201.  
  5202.                                     if(Result = ScanNodeFilter(ReadBuffer,Length,WaitNode,&Position))
  5203.                                     {
  5204.                                         if(Position < Length)
  5205.                                         {
  5206.                                             DataHold = (UBYTE *)ReadBuffer    + Position;
  5207.                                             DataSize = Length        - Position;
  5208.  
  5209.                                             Restart = FALSE;
  5210.                                         }
  5211.                                         else
  5212.                                             DataHold = NULL;
  5213.                                     }
  5214.                                 }
  5215.                             }
  5216.                         }
  5217.                     }
  5218.                 }
  5219.  
  5220.                 if(Restart)
  5221.                     RestartSerial();
  5222.             }
  5223.  
  5224.             if(Signals & (SIG_BREAK | SIG_TIMER))
  5225.             {
  5226.                 if(!Result)
  5227.                     Results[0] = RC_WARN;
  5228.  
  5229.                 break;
  5230.             }
  5231.  
  5232.             if(!Result)
  5233.                 Signals = Wait(SIG_SERIAL | SIG_TIMER | SIG_BREAK | SIG_WINDOW);
  5234.         }
  5235.         while(!Result);
  5236.     }
  5237.  
  5238.     Forbid();
  5239.  
  5240.     Window -> Flags &= ~WFLG_RMBTRAP;
  5241.  
  5242.     LT_LockWindow(Window);
  5243.  
  5244.     Permit();
  5245.  
  5246.     ReleaseWindows();
  5247.  
  5248.     if(RexxTimeoutVal)
  5249.         StopTime();
  5250.  
  5251.     if(Result)
  5252.         return(CreateResult(Result,Results));
  5253.     else
  5254.         return(NULL);
  5255. }
  5256.  
  5257. STRPTR
  5258. RexxWindow(struct RexxPkt *Pkt)
  5259. {
  5260.     enum    {    ARG_WINDOW_NAMES,ARG_WINDOW_OPEN,ARG_WINDOW_CLOSE,ARG_WINDOW_ACTIVATE,
  5261.             ARG_WINDOW_MIN,ARG_WINDOW_MAX,ARG_WINDOW_FRONT,ARG_WINDOW_BACK,
  5262.             ARG_WINDOW_TOP,ARG_WINDOW_BOTTOM,ARG_WINDOW_UP,ARG_WINDOW_DOWN };
  5263.  
  5264.     STRPTR    *Names = (STRPTR *)Args[ARG_WINDOW_NAMES];
  5265.     LONG     Index;
  5266.  
  5267.     while(*Names)
  5268.     {
  5269.         if((Index = ToWindow(*Names++)) != -1)
  5270.         {
  5271.             if(Args[ARG_WINDOW_OPEN])
  5272.             {
  5273.                 Forbid();
  5274.  
  5275.                 switch(Index)
  5276.                 {
  5277.                     case WINDOWID_BUFFER:
  5278.  
  5279.                         LaunchBuffer();
  5280.                         break;
  5281.  
  5282.                     case WINDOWID_UPLOAD_QUEUE:
  5283.  
  5284.                         CreateQueueProcess();
  5285.  
  5286.                         break;
  5287.  
  5288.                     case WINDOWID_REVIEW:
  5289.  
  5290.                         if(!ReviewWindow)
  5291.                             CreateReview();
  5292.  
  5293.                         break;
  5294.  
  5295.                     case WINDOWID_PACKET:
  5296.  
  5297.                         if(!PacketWindow)
  5298.                             CreatePacketWindow();
  5299.  
  5300.                         break;
  5301.  
  5302.                     case WINDOWID_FASTMACROS:
  5303.  
  5304.                         if(!FastWindow)
  5305.                             OpenFastWindow();
  5306.  
  5307.                         break;
  5308.  
  5309.                     case WINDOWID_STATUS:
  5310.  
  5311.                         if(!InfoWindow)
  5312.                             OpenInfoWindow();
  5313.  
  5314.                         break;
  5315.  
  5316.                     case WINDOWID_MAIN:
  5317.  
  5318.                         if(!IconTerminated)
  5319.                             IconTerminated = TRUE;
  5320.  
  5321.                         break;
  5322.  
  5323.                     case WINDOWID_SINGLE_CHAR_ENTRY:
  5324.  
  5325.                         if(Window)
  5326.                             OpenMatrixWindow(Window);
  5327.  
  5328.                         break;
  5329.                 }
  5330.  
  5331.                 Permit();
  5332.             }
  5333.  
  5334.             if(Args[ARG_WINDOW_CLOSE])
  5335.             {
  5336.                 Forbid();
  5337.  
  5338.                 switch(Index)
  5339.                 {
  5340.                     case WINDOWID_UPLOAD_QUEUE:
  5341.  
  5342.                         CloseQueueWindow();
  5343.                         break;
  5344.  
  5345.                     case WINDOWID_BUFFER:
  5346.  
  5347.                         TerminateBuffer();
  5348.                         break;
  5349.  
  5350.                     case WINDOWID_REVIEW:
  5351.  
  5352.                         if(ReviewWindow)
  5353.                             DeleteReview();
  5354.  
  5355.                         break;
  5356.  
  5357.                     case WINDOWID_PACKET:
  5358.  
  5359.                         if(PacketWindow)
  5360.                             DeletePacketWindow(FALSE);
  5361.  
  5362.                         break;
  5363.  
  5364.                     case WINDOWID_FASTMACROS:
  5365.  
  5366.                         if(FastWindow)
  5367.                             CloseFastWindow();
  5368.  
  5369.                         break;
  5370.  
  5371.                     case WINDOWID_STATUS:
  5372.  
  5373.                         if(InfoWindow)
  5374.                             CloseInfoWindow();
  5375.  
  5376.                         break;
  5377.  
  5378.                     case WINDOWID_MAIN:
  5379.  
  5380.                         if(Window)
  5381.                             DoIconify = TRUE;
  5382.  
  5383.                         break;
  5384.  
  5385.                     case WINDOWID_SINGLE_CHAR_ENTRY:
  5386.  
  5387.                         CloseMatrixWindow();
  5388.                         break;
  5389.                 }
  5390.  
  5391.                 Permit();
  5392.             }
  5393.  
  5394.             if(Args[ARG_WINDOW_ACTIVATE])
  5395.             {
  5396.                 Forbid();
  5397.  
  5398.                 switch(Index)
  5399.                 {
  5400.                     case WINDOWID_UPLOAD_QUEUE:
  5401.  
  5402.                         CreateQueueProcess();
  5403.  
  5404.                         break;
  5405.  
  5406.                     case WINDOWID_BUFFER:
  5407.  
  5408.                         LaunchBuffer();
  5409.                         break;
  5410.  
  5411.                     case WINDOWID_REVIEW:
  5412.  
  5413.                         if(ReviewWindow)
  5414.                             BumpWindow(ReviewWindow);
  5415.  
  5416.                         break;
  5417.  
  5418.                     case WINDOWID_PACKET:
  5419.  
  5420.                         if(PacketWindow)
  5421.                             BumpWindow(PacketWindow);
  5422.  
  5423.                         break;
  5424.  
  5425.                     case WINDOWID_FASTMACROS:
  5426.  
  5427.                         if(FastWindow)
  5428.                             BumpWindow(FastWindow);
  5429.  
  5430.                         break;
  5431.  
  5432.                     case WINDOWID_STATUS:
  5433.  
  5434.                         if(InfoWindow)
  5435.                             BumpWindow(InfoWindow);
  5436.  
  5437.                         break;
  5438.  
  5439.                     case WINDOWID_MAIN:
  5440.  
  5441.                         if(Window)
  5442.                             BumpWindow(Window);
  5443.  
  5444.                         break;
  5445.  
  5446.                     case WINDOWID_SINGLE_CHAR_ENTRY:
  5447.  
  5448.                         if(MatrixWindow)
  5449.                             BumpWindow(MatrixWindow);
  5450.  
  5451.                         break;
  5452.                 }
  5453.  
  5454.                 Permit();
  5455.             }
  5456.  
  5457.             if(Args[ARG_WINDOW_MIN])
  5458.             {
  5459.                 struct Window *SomeWindow = NULL;
  5460.  
  5461.                 Forbid();
  5462.  
  5463.                 switch(Index)
  5464.                 {
  5465.                     case WINDOWID_REVIEW:
  5466.  
  5467.                         SomeWindow = ReviewWindow;
  5468.                         break;
  5469.  
  5470.                     case WINDOWID_PACKET:
  5471.  
  5472.                         SomeWindow = PacketWindow;
  5473.                         break;
  5474.  
  5475.                     case WINDOWID_FASTMACROS:
  5476.  
  5477.                         SomeWindow = FastWindow;
  5478.                         break;
  5479.  
  5480.                     case WINDOWID_STATUS:
  5481.  
  5482.                         SomeWindow = InfoWindow;
  5483.                         break;
  5484.                 }
  5485.  
  5486.                 if(SomeWindow)
  5487.                     ChangeWindowBox(SomeWindow,SomeWindow -> LeftEdge,SomeWindow -> TopEdge,SomeWindow -> MinWidth,SomeWindow -> MinHeight);
  5488.  
  5489.                 Permit();
  5490.             }
  5491.  
  5492.             if(Args[ARG_WINDOW_MAX])
  5493.             {
  5494.                 struct Window *SomeWindow = NULL;
  5495.  
  5496.                 Forbid();
  5497.  
  5498.                 switch(Index)
  5499.                 {
  5500.                     case WINDOWID_REVIEW:
  5501.  
  5502.                         SomeWindow = ReviewWindow;
  5503.                         break;
  5504.  
  5505.                     case WINDOWID_PACKET:
  5506.  
  5507.                         SomeWindow = PacketWindow;
  5508.                         break;
  5509.  
  5510.                     case WINDOWID_FASTMACROS:
  5511.  
  5512.                         SomeWindow = FastWindow;
  5513.                         break;
  5514.  
  5515.                     case WINDOWID_STATUS:
  5516.  
  5517.                         SomeWindow = InfoWindow;
  5518.                         break;
  5519.                 }
  5520.  
  5521.                 if(SomeWindow)
  5522.                     ChangeWindowBox(SomeWindow,0,0,SomeWindow -> MaxWidth,SomeWindow -> MaxHeight);
  5523.  
  5524.                 Permit();
  5525.             }
  5526.  
  5527.             if(Args[ARG_WINDOW_FRONT])
  5528.             {
  5529.                 Forbid();
  5530.  
  5531.                 switch(Index)
  5532.                 {
  5533.                     case WINDOWID_UPLOAD_QUEUE:
  5534.  
  5535.                         CreateQueueProcess();
  5536.  
  5537.                         break;
  5538.  
  5539.                     case WINDOWID_BUFFER:
  5540.  
  5541.                         LaunchBuffer();
  5542.                         break;
  5543.  
  5544.                     case WINDOWID_REVIEW:
  5545.  
  5546.                         if(ReviewWindow)
  5547.                             WindowToFront(ReviewWindow);
  5548.  
  5549.                         break;
  5550.  
  5551.                     case WINDOWID_PACKET:
  5552.  
  5553.                         if(PacketWindow)
  5554.                             WindowToFront(PacketWindow);
  5555.  
  5556.                         break;
  5557.  
  5558.                     case WINDOWID_FASTMACROS:
  5559.  
  5560.                         if(FastWindow)
  5561.                             WindowToFront(FastWindow);
  5562.  
  5563.                         break;
  5564.  
  5565.                     case WINDOWID_STATUS:
  5566.  
  5567.                         if(InfoWindow)
  5568.                             WindowToFront(InfoWindow);
  5569.  
  5570.                         break;
  5571.  
  5572.                     case WINDOWID_MAIN:
  5573.  
  5574.                         if(Window)
  5575.                             WindowToFront(Window);
  5576.  
  5577.                         break;
  5578.  
  5579.                     case WINDOWID_SINGLE_CHAR_ENTRY:
  5580.  
  5581.                         if(MatrixWindow)
  5582.                             WindowToFront(MatrixWindow);
  5583.  
  5584.                         break;
  5585.                 }
  5586.  
  5587.                 Permit();
  5588.             }
  5589.  
  5590.             if(Args[ARG_WINDOW_BACK])
  5591.             {
  5592.                 Forbid();
  5593.  
  5594.                 switch(Index)
  5595.                 {
  5596.                     case WINDOWID_REVIEW:
  5597.  
  5598.                         if(ReviewWindow)
  5599.                             WindowToBack(ReviewWindow);
  5600.  
  5601.                         break;
  5602.  
  5603.                     case WINDOWID_PACKET:
  5604.  
  5605.                         if(PacketWindow)
  5606.                             WindowToBack(PacketWindow);
  5607.  
  5608.                         break;
  5609.  
  5610.                     case WINDOWID_FASTMACROS:
  5611.  
  5612.                         if(FastWindow)
  5613.                             WindowToBack(FastWindow);
  5614.  
  5615.                         break;
  5616.  
  5617.                     case WINDOWID_STATUS:
  5618.  
  5619.                         if(InfoWindow)
  5620.                             WindowToBack(InfoWindow);
  5621.  
  5622.                         break;
  5623.  
  5624.                     case WINDOWID_MAIN:
  5625.  
  5626.                         if(Window)
  5627.                             WindowToBack(Window);
  5628.  
  5629.                         break;
  5630.  
  5631.                     case WINDOWID_SINGLE_CHAR_ENTRY:
  5632.  
  5633.                         if(MatrixWindow)
  5634.                             WindowToBack(MatrixWindow);
  5635.  
  5636.                         break;
  5637.                 }
  5638.  
  5639.                 Permit();
  5640.             }
  5641.  
  5642.             Forbid();
  5643.  
  5644.             if(Index == WINDOW_REVIEW && ReviewWindow)
  5645.             {
  5646.                 if(Args[ARG_WINDOW_TOP])
  5647.                     MoveReview(REVIEW_MOVE_TOP);
  5648.  
  5649.                 if(Args[ARG_WINDOW_BOTTOM])
  5650.                     MoveReview(REVIEW_MOVE_BOTTOM);
  5651.  
  5652.                 if(Args[ARG_WINDOW_UP])
  5653.                     MoveReview(REVIEW_MOVE_UP);
  5654.  
  5655.                 if(Args[ARG_WINDOW_DOWN])
  5656.                     MoveReview(REVIEW_MOVE_DOWN);
  5657.             }
  5658.  
  5659.             Permit();
  5660.         }
  5661.     }
  5662.  
  5663.     return(NULL);
  5664. }
  5665.  
  5666. STRPTR
  5667. RexxRX(struct RexxPkt *Pkt)
  5668. {
  5669.     enum    {    ARG_RX_CONSOLE,ARG_RX_ASYNC,ARG_RX_COMMAND };
  5670.  
  5671.     struct MsgPort    *RexxPort;
  5672.     BOOL         Eaten = FALSE;
  5673.  
  5674.     if(RexxPort = FindPort(RXSDIR))
  5675.     {
  5676.         struct MsgPort __aligned     SinglePort;
  5677.         struct RexxMsg            *HostMessage;
  5678.  
  5679.         InitSinglePort(&SinglePort);
  5680.  
  5681.         if(HostMessage = CreateRexxMsg(&SinglePort,"term",RexxPortName))
  5682.         {
  5683.             if(HostMessage -> rm_Args[0] = CreateArgstring(Args[ARG_RX_COMMAND],strlen(Args[ARG_RX_COMMAND])))
  5684.             {
  5685.                 BPTR Stream,OutputStream;
  5686.                 struct MsgPort *OldConsoleTask;
  5687.  
  5688.                 Stream = NULL;
  5689.  
  5690.                 if(Args[ARG_RX_CONSOLE] && WindowName[0])
  5691.                 {
  5692.                     UBYTE LocalName[MAXPUBSCREENNAME + 1];
  5693.  
  5694.                     if(Window)
  5695.                     {
  5696.                         if(!GetPubScreenName(Window -> WScreen,LocalName))
  5697.                             LocalName[0] = 0;
  5698.                     }
  5699.  
  5700.                     if(LocalName[0])
  5701.                     {
  5702.                         UBYTE LocalBuffer[MAX_FILENAME_LENGTH];
  5703.  
  5704.                         SPrintf(LocalBuffer,WindowName,LocalName);
  5705.  
  5706.                         Stream = Open(LocalBuffer,MODE_NEWFILE);
  5707.                     }
  5708.                     else
  5709.                         Stream = Open(WindowName,MODE_NEWFILE);
  5710.                 }
  5711.  
  5712.                 if(GoodStream(Stream))
  5713.                 {
  5714.                     OldConsoleTask = GetConsoleTask();
  5715.  
  5716.                     SetConsoleTask(((struct FileHandle *)BADDR(Stream)) -> fh_Type);
  5717.  
  5718.                     OutputStream = Open("CONSOLE:",MODE_NEWFILE);
  5719.                 }
  5720.                 else
  5721.                     OutputStream = NULL;
  5722.  
  5723.                 HostMessage -> rm_Action = RXCOMM;
  5724.  
  5725.                 if(!Stream || !OutputStream)
  5726.                     HostMessage -> rm_Action |= RXFF_NOIO;
  5727.  
  5728.                 if(Args[ARG_RX_ASYNC])
  5729.                 {
  5730.                     RexxPktCleanup(Pkt,NULL);
  5731.  
  5732.                     Eaten = TRUE;
  5733.                 }
  5734.  
  5735.                 Forbid();
  5736.  
  5737.                 PutMsg(RexxPort,HostMessage);
  5738.  
  5739.                 ClrSignal(SIGF_SINGLE);
  5740.  
  5741.                 WaitPort(&SinglePort);
  5742.  
  5743.                 Permit();
  5744.  
  5745.                 GetMsg(&SinglePort);
  5746.  
  5747.                 if(!Eaten)
  5748.                 {
  5749.                     Results[0] = HostMessage -> rm_Result1;
  5750.                     Results[1] = HostMessage -> rm_Result2;
  5751.                 }
  5752.  
  5753.                 if(OutputStream)
  5754.                 {
  5755.                     SetConsoleTask(OldConsoleTask);
  5756.                     Close(OutputStream);
  5757.                 }
  5758.  
  5759.                 if(Stream)
  5760.                     Close(Stream);
  5761.             }
  5762.             else
  5763.             {
  5764.                 Results[0] = RC_ERROR;
  5765.                 Results[1] = ERR10_003;
  5766.             }
  5767.  
  5768.             DeleteRexxMsg(HostMessage);
  5769.         }
  5770.         else
  5771.         {
  5772.             Results[0] = RC_ERROR;
  5773.             Results[1] = ERR10_003;
  5774.         }
  5775.     }
  5776.     else
  5777.     {
  5778.         Results[0] = RC_ERROR;
  5779.         Results[1] = ERR10_013;
  5780.     }
  5781.  
  5782.     if(!Eaten)
  5783.         RexxPktCleanup(Pkt,NULL);
  5784.  
  5785.     return(NULL);
  5786. }
  5787.  
  5788. STRPTR
  5789. RexxExecTool(struct RexxPkt *Pkt)
  5790. {
  5791.     enum    {    ARG_EXECTOOL_CONSOLE,ARG_EXECTOOL_ASYNC,ARG_EXECTOOL_PORT,ARG_EXECTOOL_COMMAND };
  5792.  
  5793.     UBYTE         CommandName[MAX_FILENAME_LENGTH],
  5794.              CommandArgs[MAX_FILENAME_LENGTH],
  5795.             *Index = Args[ARG_EXECTOOL_COMMAND];
  5796.     BPTR         Stream,OutputStream;
  5797.     struct MsgPort    *OldConsoleTask;
  5798.     LONG         Error;
  5799.     LONG         i;
  5800.     BOOL         Eaten = FALSE;
  5801.  
  5802.     while(*Index == ' ' || *Index == '\t')
  5803.         Index++;
  5804.  
  5805.     for(i = 0 ; Index[i] != ' ' && Index[i] != '\t' ; i++)
  5806.         CommandName[i] = Index[i];
  5807.  
  5808.     CommandName[i] = 0;
  5809.  
  5810.     Index += i;
  5811.  
  5812.     while(*Index == ' ' || *Index == '\t')
  5813.         Index++;
  5814.  
  5815.     if(Args[ARG_EXECTOOL_PORT])
  5816.         SPrintf(CommandArgs,"%s %s\n",Index,RexxPortName);
  5817.     else
  5818.         SPrintf(CommandArgs,"%s\n",Index);
  5819.  
  5820.     strcat(CommandName," ");
  5821.     strcat(CommandName,CommandArgs);
  5822.  
  5823.     if(Args[ARG_EXECTOOL_ASYNC])
  5824.     {
  5825.         RexxPktCleanup(Pkt,NULL);
  5826.  
  5827.         Eaten = TRUE;
  5828.     }
  5829.  
  5830.     Stream = NULL;
  5831.  
  5832.     if(Args[ARG_EXECTOOL_CONSOLE] && WindowName[0])
  5833.     {
  5834.         UBYTE LocalName[MAXPUBSCREENNAME + 1];
  5835.  
  5836.         if(Window)
  5837.         {
  5838.             if(!GetPubScreenName(Window -> WScreen,LocalName))
  5839.                 LocalName[0] = 0;
  5840.         }
  5841.  
  5842.         if(LocalName[0])
  5843.         {
  5844.             UBYTE LocalBuffer[MAX_FILENAME_LENGTH];
  5845.  
  5846.             SPrintf(LocalBuffer,WindowName,LocalName);
  5847.  
  5848.             Stream = Open(LocalBuffer,MODE_NEWFILE);
  5849.         }
  5850.         else
  5851.             Stream = Open(WindowName,MODE_NEWFILE);
  5852.     }
  5853.  
  5854.     if(GoodStream(Stream))
  5855.     {
  5856.         OldConsoleTask = GetConsoleTask();
  5857.  
  5858.         SetConsoleTask(((struct FileHandle *)BADDR(Stream)) -> fh_Type);
  5859.  
  5860.         OutputStream = Open("CONSOLE:",MODE_NEWFILE);
  5861.     }
  5862.     else
  5863.         OutputStream = NULL;
  5864.  
  5865.     if(Stream && OutputStream)
  5866.     {
  5867.         Error = SystemTags(CommandName,
  5868.             SYS_Input,    Stream,
  5869.             SYS_Output,    OutputStream,
  5870.             SYS_UserShell,    TRUE,
  5871.         TAG_DONE);
  5872.     }
  5873.     else
  5874.     {
  5875.         Error = SystemTags(CommandName,
  5876.             SYS_UserShell,    TRUE,
  5877.         TAG_DONE);
  5878.     }
  5879.  
  5880.     if(OutputStream)
  5881.     {
  5882.         SetConsoleTask(OldConsoleTask);
  5883.         Close(OutputStream);
  5884.     }
  5885.  
  5886.     if(Stream)
  5887.         Close(Stream);
  5888.  
  5889.     if(!Eaten)
  5890.     {
  5891.         if(Error)
  5892.         {
  5893.             Results[0] = RC_ERROR;
  5894.             Results[1] = Error;
  5895.         }
  5896.  
  5897.         RexxPktCleanup(Pkt,NULL);
  5898.     }
  5899.  
  5900.     return(NULL);
  5901. }
  5902.